注解深入浅出(四反射)
Posted 持续学习刻意练习
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了注解深入浅出(四反射)相关的知识,希望对你有一定的参考价值。
第二章注解深入浅出
四、反射
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 简介
- Class 类:代表一个类【java.lang.Class】
- Field 类:代表类的成员变量(成员变量也称为类的属性)【java.lang.reflect.Field】
- Method 类:代表类的方法【java.lang.reflect.Method】
- Constructor 类:代表类的构造方法【java.lang.reflect.Constructor】
- Array 类:提供了动态创建数组,以及访问数组的元素的静态方法
- Modifier 类:【java.lang.reflect.Modifier】
4.4 反射获取 Class 类
Class 类没有共有的构造方法,被 jvm 调用的(简单理解:new 对象或者被类加载器加载的时候),在 Java 中,每个 class 都有一个相应的 Class 对象,也就是说,当我们编写一个类,编译完成后,在生成的 .class 文件中,就会产生一个 Class 对象,用于表示这个类的类型信息。
获取 Class 的三种方式:
- 利用对象调用 getClass() 方法获取该对象的 Class 实例
Person person = new Person();
Class<? extend Person> personClass01 = person.getClass();
- 使用 Class 类的静态方法 forName(),用类的名字获取一个 Class 实例
try
Class<?> personClass02 = Class.forName("Person");
catch (ClassNotFoundException e)
e.printStackTrace();
- 运用 .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() | 获取某类实现的接口 |
以上是关于注解深入浅出(四反射)的主要内容,如果未能解决你的问题,请参考以下文章
Java反射学习总结五(Annotation(注解)-基础篇)