黑马程序员技术交流社区

标题: java的反射机制 Class类 [打印本页]

作者: Sakuratossi    时间: 2014-8-29 00:57
标题: java的反射机制 Class类
Class c = Class.forName(“类文件名带包名”);   ——获得该类的字节码文件。
Object obj = c.newInstance() ——创建一个空参数类的对象。

如果要获得带参数的对象,就要用到Constructor对象的方法
任何数据类型都可以被字节码文件描述

字节码文件的 constructor()获取方法:
只获得本类中所有的构造函数,包括私有?
Constructor<T>       getDeclaredConstructor(Class<?>... parameterTypes)
Constructor<?>[]    getDeclaredConstructors()
本类和父类 公有的构造函数。
Constructor<T>       getConstructor(Class<?>... parameterTypes)
Constructor<?>[]     getConstructors()

————  string类型所属的字节码文件对应的类是String.class,int也一样。
———— 通过构造器对象的newInstance方法将对象初始化
Class c = Class.forName(“类文件名带包名”);
Constructor constructor = c.getConstructor(String.class,int.class)
Object obj = constructor.newInstance(“小明”, 89);

字节码文件的 字段 获取方法:

Field      getDeclaredField(String name)
                              返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
Field[]     getDeclaredFields()
                              返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
Field      getField(String name)
                              返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
Field[]     getFields()
                              返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
   

Class c = Class.forName(“类文件名带包名”);
Constructor constructor = c.getConstructor(String.class, int.class);
Object obj = constructor.newInstance(“xiaoming”,23);

Field filed = c.getDeclaredFied(“age”);
field.setAccessible(true) 对私有字段取消权限检查(暴力访问)setAccessible(true)
field.set(obj, 89);
Object o = field.get(obj)    // 获取obj对象的age的值。
sop(o) — 89.


字节码文件的 方法 获取方法:
只获得本类中所有的方法,包括私有
Method    getDeclaredMethod(String name, Class<?>... parameterTypes)
Method[]     getDeclaredMethods()
Method     getMethod(String name, Class<?>... parameterTypes)
Method[]     getMethods()

Class c = Class.forName(“类文件名带包名”);
Constructor constructor = c.getConstructor(String.class, int.class);
Object obj = constructor.newInstance(“xiaoming”,23);

相较于构造函数就在method方法中多了一个方法名

无参方法
Method m = c.getMethod(“方法名”, null)   
有参数的方法
Method m = c.getMethod(“方法名”, 参数类型.class)
c.getMethod(“show”,String.class,int.class)

运行方法
Method类中的invoke()方法:
非静态方法:
无参数:
m.invoke(所属对象,null)    // m.invoke(obj,null);
有参数:
m.invoke(所述对象,参数)  // m.invoke(obj,”小红”, 21);
静态方法 不需要用到对象
无参数
m.invoke(null,null)  
有参数
m.invoke(null,参数)  // m.invoke(null,”小红”, 21);




作者: 小子考驾照    时间: 2014-8-29 01:11
看的挺快啊,想尽快看完啊
作者: Sakuratossi    时间: 2014-8-29 10:09
小子考驾照 发表于 2014-8-29 01:11
看的挺快啊,想尽快看完啊

其实已经很慢了。。。看到后面忘了前面:L
作者: 天黑偷牛    时间: 2014-8-29 22:42
赞一个,赞一个
作者: 迦南    时间: 2014-8-29 22:46
写的不错,!!
作者: liqi    时间: 2014-8-29 23:01
恩,不错
作者: 可无奈    时间: 2014-8-29 23:34
反射机制是我的薄弱点
作者: dhgcy    时间: 2014-8-31 14:04
结构清晰  容易理解
作者: 彭卫红    时间: 2014-8-31 14:05
学习学习




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2