第二章注解深入浅出(四、反射)

四、反射

4.1 什么是发射机制

Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。 注意关键词:运行状态,换句话说,Java 程序可以加载一个运行时才得知名称的 class,获悉其完整构造(但不包括 methods 定义),并生成其对象实体、或对其 fields 设值、或唤起其 methods。

反射:是一种机制,利用该机制可以在程序运行过程中对类进行解剖并操作类中的方法、属性、构造方法等成员。是另外一种调用构造方法、普通方法、属性的方式。

对比普通方法,发射功能更强,但是更麻烦,反射操作的统一步骤,获取 Class 字节码对象,
要操作什么就获取什么(getxxx(),getDeclaredXXX()),
要操作构造方法,就获取 Constructor 对象;
要操作普通方法,就获取 Method 对象;
要操作属性字段,就获取 Field 对象;
如果操作的类型是 private,就提前设置允许暴力反射:setAccessible(true)

4.2 反射机制主要提供的功能

  • 在运行时判断任意一个对象所属的类
  • 在运行时构造任意一个类的对象
  • 在运行时判断任意一个类所具有的成员变量和方法
  • 在运行时调用任意一个对象的方法

4.3 Java Reflection API 简介

  1. Class 类:代表一个类【java.lang.Class】
  2. Field 类:代表类的成员变量(成员变量也称为类的属性)【java.lang.reflect.Field】
  3. Method 类:代表类的方法【java.lang.reflect.Method】
  4. Constructor 类:代表类的构造方法【java.lang.reflect.Constructor】
  5. Array 类:提供了动态创建数组,以及访问数组的元素的静态方法
  6. Modifier 类:【java.lang.reflect.Modifier】

4.4 反射获取 Class 类

Class 类没有共有的构造方法,被 jvm 调用的(简单理解:new 对象或者被类加载器加载的时候),在 Java 中,每个 class 都有一个相应的 Class 对象,也就是说,当我们编写一个类,编译完成后,在生成的 .class 文件中,就会产生一个 Class 对象,用于表示这个类的类型信息。

获取 Class 的三种方式:

  1. 利用对象调用 getClass() 方法获取该对象的 Class 实例
Person person = new Person();
Class<? extend Person> personClass01 = person.getClass();
  1. 使用 Class 类的静态方法 forName(),用类的名字获取一个 Class 实例
try {
    Class<?> personClass02 = Class.forName("Person");
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}
  1. 运用 .class 的方式来获取 Class 实例,对于基本数据类型的封装类,还可以采用 .TYPE 来获取相对应的基本数据类型的 Class 实例
Class<? extends Person> personClass03 = Person.class;

说明:在运行期间,如果我们要产生某个类的对象,Java 虚拟机(JVM)会检查该类型的 Class 对象是否已被加载。如果没有被加载,JVM 会根据类的名称找到 .class 文件并加载它。一旦某个类型的 Class 对象已被加载到内存,就可以用它来产生该类型的所有对象。

4.5 反射调用

发射调用 Constructor:newInstance();
反射调用 Method:invoke();
反射调用 Field:set(),get()

方法关键字含义
getDeclaredMethods()获取所有方法
getReturnType()获取方法的返回类型
getParameterTypes()获取方法的传入参数类型
getDeclaredMethod(“方法名”, 参数类型.class, ……)获取特定的方法
构造方法关键字含义
getDeclaredConstructors()获取所有的构造方法
getDeclaredConstructor(参数类型.class, ……)获取特定的构造方法
父类和父接口含义
getSuperclass()获取某类的父类
getInterfaces()获取某类实现的接口
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值