黑马程序员技术交流社区

标题: java 反射小结 [打印本页]

作者: 洪伟    时间: 2015-6-17 14:18
标题: java 反射小结
学习了 java的反射 总结了如下知识点:
1.java的反射是基于Class类的,我们可以将其他的类看成是这个类的对象,通过这个类我们可以得到每个类下面的方法、属性、以及实现的接口、父类等等。
  java的反射 其实就是将类的各种成分映射成相应的java类。
2.每个类都有一份字节码(通过字节码找到计算机中对应的类的2进制代码),获取类的字节码方式有 对象名.getclass 、类名.class、Class.forname(".....");
3.java中有9个预定义的类(8个基本数据类型+void),他们也有字节码。int.class == intager.TYPE  ps: 数组类型Class 用 isprimitive 是返回false 的 因为数组要用 isArray
4.反射中 常用的类有 Constructer(构造方法),Method(方法),Field(属性)等等。。
5.通过反射可以创建实例对象,有两种方式可以通过构造方法(Constructer)或者调用无参构造方法。Constructer c = 类的字节码.getConstructer(..); 实例对象 = c.newInstence(...)
  或者直接字节码.newInstence();
6.通过反射获取类的属性,可以通过  字节码.getField("属性名");  这时会返回一个Field的对象,但这个对象的值并不是我们想要的属性值,想得到真正还要制定是那个实例的这个属性
  field.get(实例);当然既然可以获取值也可以设置值  通过 field.set(实例名,新值)
7.反射到成员方法:Method m  = 字节码.getMethod("方法名",方法参数的字节码);  m.invoke(实例对象,参数);当实例对象为null 是  调用的是静态方法。
8.在java的方法中,我们可以设置接收的参数为数组类型,比如:main()。这时会存在一个问题:当我们通过 Method m = Class.forName("类名").getMethod("main",String[].class);得
  到mian()方法后 ,通过 m.invoke(null,new String[]={"123","456"});的时候会发生一个参数个数不匹配的问题,这个问题我们该如何解决呢。原来 java 把我们传的String数组给打开了
  原来的一个对象就变成两个了,解决方法  将这个数组强制转型为 object  或者在外面再包一个object数组
9.反射的引用就是开发框架,因为在框架写好的时候 其他的类还没写好,而在运行时才直到其他的类 ,这时就要用到反射




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