学习了 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.反射的引用就是开发框架,因为在框架写好的时候 其他的类还没写好,而在运行时才直到其他的类 ,这时就要用到反射 |
|