Java的反射机制
一、什么是反射
反射是Java的特征之一,是一种间接操作目标对象的机制,核心是JVM在运行的时候才动态加载类,并且对于任意一个类,都能够知道这个类的所有属性和方法,调用方法/访问属性,不需要提前在编译期知道运行的对象是谁,他允许运行中的Java程序获取类的信息,并且可以操作类或对象内部属性。程序中对象的类型一般都是在编译期就确定下来的,而当我们的程序在运行时,可能需要动态的加载一些类,这些类因为之前用不到,所以没有加载到jvm,这时,使用Java反射机制可以在运行期动态的创建对象并调用其属性,它是在运行时根据需要才加载。
在我们日常的编程中不知不觉已经习惯“使用”反射机制——在使用IDEA进行开发的时候,在对象名后加一个“.”就能够自动的获得该对象的所有属性和方法,这种功能可以说大大的遍历我们的开发过程。这种功能的实现依靠的就是反射机制。
二、反射机制的作用
- 通过反射机制可以在运行时获取类的各种属性和方法,进行反编译
- 反射最重要的用途就是开发各种通用框架。比如很多框架(Spring)都是配置化的(比如通过XML文件配置Bean),为了保证框架的通用性,他们可能需要根据配置文件加载不同的类或者对象,调用不同的方法,这个时候就必须使用到反射了,运行时动态加载需要的加载的对象
- 获取一个类的访问修饰符、成员和方法、构造方法和超类信息
- 获取并设置对象的一个成员,这个成员可以在运行期间才知道
利用java的反射机制可以很灵活的对加载到Java虚拟机中的类信息进行检测
三、反射机制的基本原理
四、使用反射机制
首先介绍和反射相关的类:
- Java.lang.Class:java反射机制的起源,当一个类被加载之后,java虚拟机就会自动生成一个Class对象,通过这个Class对象,我们就能够获得加载到java虚拟机中的这个Class对象的所属方法、成员和构造方法等信息。
- Java.lang.reflect:reflect包下的 Constructor、 Field 、 Method、 Modifier,通过反射方式获取
获得Class
(1)Object-->getClass
(2)任何数据类型(包括基本的数据类型)都有一个“静态”的class属性
(3)通过class类的静态方法:forName(String className),应用范围较广
判断某个对象是否为某个类的实例
public native boolean isInstance(Object obj);
通过反射创造实例
-
Class对象的newInstance()方法——动态代理中实现动态生成代理类的关键
String.class.newInstance()
-
通过getConstructor()或getDeclareConstructor()方法获得构造器(Constructor)对象并调用其的newInstance()方法
String.class.getConstructor(String.class).newInstance("Test");
参考博文:
https://blog.csdn.net/haluoluo211/article/details/49516689
https://blog.csdn.net/a745233700/article/details/82893076