• JAVA反射了解


    被反射类文件:

    package ref.lect;
    
    import java.util.Date;
    
    public class Exe1 {
        
        public void publicMethod(String str){
            System.out.println("调用了::共有的方法,参数为:: " + str);
        }
        
        protected void protectedMethod(String str){
            System.out.println("调用了::受保护的方法,参数为:: " + str);
        }
        
        void xMethod(String str){
            System.out.println("调用了::受保护的方法,参数为:: " + str);
        }
        
        private int privateMethod(int num){
            System.out.println("调用了::受保护的方法,参数为:: " + num);
            return num;
        }
        
        private int id;
        public String name;
        protected Date birthday;
        
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Date getBirthday() {
            return birthday;
        }
    
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
        
        public static void main(String[] args) {
            System.out.println("执行main方法了...");
        }
    }

    使用反射类文件:

    package ref.lect.invok;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.Date;
    
    import ref.lect.Exe1;
    
    public class Envok1 {
        public static void main(String[] args) {
            try {
                System.out.println("=================获取类对象===============");
                Class<?> exe1 = Class.forName("ref.lect.Exe1");
                System.out.println("类名 :: "+exe1.getName());
                
                System.out.println("=================获取方法名===============");
                Method[] ms = exe1.getMethods();
                for (int i = 0; i < ms.length; i++) {
                    System.out.println("方法名"+i+":: "+ms[i]);
                }
                
                System.out.println("=================获取成员名===============");
                Field[] fs = exe1.getDeclaredFields();
                for (int i = 0; i < fs.length; i++) {
                    System.out.println("成员名"+i+":: "+fs[i]);
                }
                
                System.out.println("================= 设置列   private protected public ===============");
                Object obj = Class.forName("ref.lect.Exe1").getConstructor().newInstance();
                Field fn = Class.forName("ref.lect.Exe1").getField("name"); // public
                fn.set(obj, "刘德华");
                Exe1 e1 = (Exe1)obj;
                System.out.println("1:: 被set后的name值:: "+ e1.getName());
                System.out.println("1:: 被set后的birthday值:: "+ e1.getBirthday());
                System.out.println("1:: 被set后的id值:: "+ e1.getId());
                
                Field fb = Class.forName("ref.lect.Exe1").getDeclaredField("birthday");  // protected
                fb.setAccessible(true); // 暴力反射
                fb.set(obj, new Date());
                Exe1 e2 = (Exe1)obj;
                System.out.println("2:: 被set后的name值:: "+ e2.getName());
                System.out.println("2:: 被set后的birthday值:: "+ e2.getBirthday());
                System.out.println("2:: 被set后的id值:: "+ e2.getId());
                
                Field fi = Class.forName("ref.lect.Exe1").getDeclaredField("id");  // private
                fi.setAccessible(true); // 暴力反射
                fi.set(obj, 10086);
                Exe1 e3 = (Exe1)obj;
                System.out.println("3:: 被set后的name值:: "+ e3.getName());
                System.out.println("3:: 被set后的birthday值:: "+ e3.getBirthday());
                System.out.println("3:: 被set后的id值:: "+ e3.getId());
                
                System.out.println("=======================调用method======================");
                Object mPublic = Class.forName("ref.lect.Exe1").getConstructor().newInstance();
                Method m1 = Class.forName("ref.lect.Exe1").getMethod("publicMethod",String.class);
                System.out.println(m1);
                Exe1 exe4 = (Exe1)mPublic;
                m1.invoke(exe4, "张三");
                
                Object mPrivate = Class.forName("ref.lect.Exe1").getConstructor().newInstance();
                Method m2 = Class.forName("ref.lect.Exe1").getDeclaredMethod("privateMethod",int.class);
                System.out.println(m2);
                m2.setAccessible(true);
                Exe1 exe5 = (Exe1)mPrivate;
                int num = (Integer) m2.invoke(exe5, 666);
                System.out.println("返回结果 ==> num ==> :: " + num );
                
                System.out.println("========================执行main方法================================");
                Object mMain = Class.forName("ref.lect.Exe1").getConstructor().newInstance();
                Method m3 = Class.forName("ref.lect.Exe1").getMethod("main",String[].class);
                m3.invoke(mMain, (Object)new String[]{"a","b","c"});
                
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SecurityException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }catch (NoSuchFieldException e) {
                e.printStackTrace();
            }
        }
    }

    执行结果:

    =================获取类对象===============
    类名 :: ref.lect.Exe1
    =================获取方法名===============
    方法名0:: public static void ref.lect.Exe1.main(java.lang.String[])
    方法名1:: public java.lang.String ref.lect.Exe1.getName()
    方法名2:: public int ref.lect.Exe1.getId()
    方法名3:: public void ref.lect.Exe1.setName(java.lang.String)
    方法名4:: public java.util.Date ref.lect.Exe1.getBirthday()
    方法名5:: public void ref.lect.Exe1.publicMethod(java.lang.String)
    方法名6:: public void ref.lect.Exe1.setId(int)
    方法名7:: public void ref.lect.Exe1.setBirthday(java.util.Date)
    方法名8:: public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
    方法名9:: public final void java.lang.Object.wait() throws java.lang.InterruptedException
    方法名10:: public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
    方法名11:: public boolean java.lang.Object.equals(java.lang.Object)
    方法名12:: public java.lang.String java.lang.Object.toString()
    方法名13:: public native int java.lang.Object.hashCode()
    方法名14:: public final native java.lang.Class java.lang.Object.getClass()
    方法名15:: public final native void java.lang.Object.notify()
    方法名16:: public final native void java.lang.Object.notifyAll()
    =================获取成员名===============
    成员名0:: private int ref.lect.Exe1.id
    成员名1:: public java.lang.String ref.lect.Exe1.name
    成员名2:: protected java.util.Date ref.lect.Exe1.birthday
    ================= 设置列   private protected public ===============
    1:: 被set后的name值:: 刘德华
    1:: 被set后的birthday值:: null
    1:: 被set后的id值:: 0
    2:: 被set后的name值:: 刘德华
    2:: 被set后的birthday值:: Tue May 08 16:55:27 CST 2018
    2:: 被set后的id值:: 0
    3:: 被set后的name值:: 刘德华
    3:: 被set后的birthday值:: Tue May 08 16:55:27 CST 2018
    3:: 被set后的id值:: 10086
    =======================调用method======================
    public void ref.lect.Exe1.publicMethod(java.lang.String)
    调用了::共有的方法,参数为:: 张三
    private int ref.lect.Exe1.privateMethod(int)
    调用了::受保护的方法,参数为:: 666
    返回结果 ==> num ==> :: 666
    ========================执行main方法================================
    执行main方法了...
  • 相关阅读:
    JS 中的foreach和For in比较
    SQL 查询CET使用领悟
    .NET开源项目
    asp.net获取客户端IP方法(转载)
    jQuery Mobile 基础(第四章)
    jQuery Mobile 基础(第三章)
    jQuery Mobile 基础(第二章)
    机器学习笔记之梯度下降法
    特征脸是怎么提取的之主成分分析法PCA
    word2vec初探
  • 原文地址:https://www.cnblogs.com/shenbo-/p/9009180.html
Copyright © 2020-2023  润新知