反射总结

得到class的三种方式

  • Class.forName("cn.bean.A");
  • A.class;
  • Thread.currentThread().getContextClassLoader().loadClass("cn.bean.A");

getFields()与getDeclaredFields()区别

getFields()只能访问类中声明为公有的字段,私有的字段它无法访问,能访问从其它类继承来的公有方法.

getDeclaredFields()能访问类中所有的字段,与public,private,protect无关,不能访问从其它类继承来的方法

getMethods()与getDeclaredMethods()区别

getMethods()只能访问类中声明为公有的方法,私有的方法它无法访问,能访问从其它类继承来的公有方法

getDeclaredFields()能访问类中所有的字段,与public,private,protect无关,不能访问从其它类继承来的方法

getConstructors()与getDeclaredConstructors()区别

getConstructors()只能访问类中声明为public的构造函数

getDeclaredConstructors()能访问类中所有的构造函数,与public,private,protect无关

实例化

        Class clazz = Class.forName("Demo");
        //通过带参数构造实例化
        Demo demo = (Demo) clazz.getConstructor(String.class, Integer.class).newInstance("hello", 12);
        clazz.getConstructor(new Class[]{String.class,Integer.class}).newInstance(new Object[]{"hello",12});
        //默认空构造实例化
        Demo demo1 = (Demo) clazz.newInstance();
        System.out.println(demo.getName());
        System.out.println(demo.getAge());

操作属性

        Class clazz = Class.forName("Demo");
        Demo demo = (Demo) clazz.newInstance();
        Field name = clazz.getDeclaredField("name");
        //允许访问私有变量
        name.setAccessible(true);
        name.set(demo , "hello world");
        Object obj = name.get(demo);
        System.out.println(obj);

操作方法

        Class clazz = Class.forName("Demo");
        Demo demo = (Demo) clazz.newInstance();

        Method getName = clazz.getDeclaredMethod("getName");
        Method setName = clazz.getDeclaredMethod("setName", String.class);

        //val是method的返回值
        Object val = setName.invoke(demo , "hello");
        System.out.println(demo.getName());
        System.out.println(val);
posted @ 2018-03-30 18:47  姩澕  阅读(118)  评论(0编辑  收藏  举报