目录
反射
1 定义
Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任 意一个对象,都能够调用它的任意方法和属性,既然能拿到那么,我们就可以修改部分类型信息;
这种动态获取信息以及动态调用对象方法的功能称为java语言的反射(reflection)机制。
反射重要的四个核心类
1.
反射核心类使用class关键字,包括数组,包括接口编译后生成的class文件就对应一个唯一的class对象,由JVM产生,使用这个class对象就可以获取该类的所有信息。
2. 反射调用类中的 成员 / 类属性
3. 反射调用类中的 成员 / 类方法
4. 反射调用构造方法
反射示例:
1.无论要通过反射机制干啥事,首先第一步就是获取该类的class对象(由JVM产生的,全局唯一)
注释:这一步是程序员弄不了的,我们只有获取权,没有产生权。
举例:
先创建一个Student类
测试类Test
下面三种方法,获取的都是同一个对象的class 。方法不同,目的相同。
注释:这三个获取的class对象,全局唯一,所以都是一样的地址。 (由JVM产生)
运行结果:地址相等。
创建一个Person类,让Student继续
如: per的 编译时类型是 Person , 运行时类型是 Student
那我如何知道per的运行时类型呢?
通过反射一目了然的知道了运行时类型 RTTI
2.通过反射调用构造方法。
普通的get只能获取public权限的方法或者属性
而 getDeclared...() 之类的方法:可以获取所有权限的方法或属性
案例:
举例:
与构造方法 一 一 对应
通过反射直接调用的方法:
破坏封装
通过反射破坏private封装,调用私有构造方法
这是一个私有的方法
注释: getDeclaredConstructor() 方法。反射如何得知你要获取的是哪个构造方法?
答:看你输入的参数类型和顺序,如:String String int ; String ; int; ......等等
3.通过反射调用普通方法
在Student类里面再添加两个方法
测试: 静态方法的调用
这是一一对应的。
测试:普通方法的调用
两个拓展的方法
这两个方法的使用解释要看清楚:
测试: