1.什么是Java反射

反射机制是指运行时,能动态获取类的成员变量、构造方法、成员方法,能动态调用类中的任意方法。

2.Java反射原理

Java程序执行的可分为三个阶段:编译阶段、加载阶段、运行阶段。

编译阶段:Java代码文件编译生成Class字节码文件,JDK中提供了javac.exe(代码编译器)、javadoc.exe(文档生成器)。

加载阶段:类加载器将字节码文件加载到JVM中,生成对应的Class对象,Class对象中有成员变量、构造器、成员方法,采用数组结构存储。

运行阶段:通过反射API获取及操作Class对象,实例化对象。

优点:在运行时能灵活的加载、使用类、提高代码的通用性。

缺点:类型检查、动态方法调用的额外性能开销、安全性问题。

3.Java反射常用API方法(Class对象方法)

(1)获取Class对象的四种方式

Class.forName() 通过类路径获取Class对象

类名.class 通过类名获取Class对象

实例对象.getClass() 通过实例对象获取Class对象

ClassLoader.loadClass() 通过类加载器获取Class对象

(2)操作Class对象构造方法

getDeclaredConstructor() 获取无参构造方法

getDeclaredConstructor(Class … type) 获取指定入参类型有参构造方法

getDeclaredConstructors() 获取所有构造方法

newInstance() 无参构造方法实例化对象

newInstance(Object… value) 有参构造方法实例化对象

(3)操作Class对象成员变量

getDeclaredField(String name) 获取指定名称的字段

getFiled(String name) 获取指定名称的字段

setAccessible(true) 设置私有变量可访问

getName() 获取成员变量名

get(Object object) 获取成员变量值

set(Object object, Object… value) 根据成员变量类型设置成员变量值

getAnnotations() 获取所有注解

4)操作Class对象成员方法

getDeclaredMethod(String name, Class… type) 获取指定方法名和参数类型方法

getDeclaredMethods() 获取所有成员方法

invoke(Object object, Object… value) 执行成员方法,入参:调用方法的实例对象及方法调用所需的参数列表

(5)获取Class对象继承关系

getSuperClass() 获取Class对象父类

getInterfaces() 获取Class对象实现的所有接口

getModifiers() 获取类的修饰符

getName() 获取类全名

getSimpleName() 获取类名称

4.Java反射应用场景及案例

  1. Spring框架依赖注入、JUnit单元测试
  2. 动态加载类与资源,如插件化系统、国际化资源加载
  3. 动态代理实现
  4. ORM框架对象关系映射

反射实现对象拷贝工具案例:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注