一、Java反射的核心
Java反射是Java中一个很牛的动态功能,能让程序在运行时了解类的信息,比如字段、方法等,还能改变类或对象的属性。通过反射,开发者能实现不硬编码就加载类、创建对象、调用方法等。这种机动性让反射成很多框架如Spring、Hibernate,及高级应用像动态代理、插件系统的关键技术。
关键词:Java反射,动态编程,类加载,Spring
二,JAVA反射基本机制
Java反射是用 JVM 的类加载和运行信息做的。类被JVM加载,会给它弄个唯一的Class对象。这个对象存了类的所有信息,像字段、方法啥的。
反射的核心流程:
得到Class对象:可用类名、对象或Class.forName()拿类的信息。
分析类结构,用Class对象拿字段、方法、构造器信息。
操作对象:调用方法、访问值,还能改私有成员,要设置setAccessible(true)。
三。Java 反射的主要类及接口
Java 反射 API 在 java.lang.reflect 包;主要类有:
Class<T>:表示类的信息,反射的起点。
Field:就是类中的那个,嗯,成员变量。
Method:就是类里头的功能。
Constructor<T>:这就是类的创建方法。
Annotation,给类加注解用的东西。
示例代码:
Java
深色版本
// 拿到Class对象
Class<?> clazz = ClassforName("com.example.Person");
拿字段然后改数值
FieldNameField clazz.getDeclaredField("name");
nameField.setAccessible(true); 允许访问隐藏字段
nameField给personObj设置名称为Alice
// 调用方法
sayHelloMethod是从clazz得到的,调用方法是sayHello,带有一个String参数
sayHelloMethod.invoke(personObj, "Hi, Reflexion!")
四 Java反射常用场合
框架开发:
Spring框架,反射加载Bean,实现DI和IoC。
Hibernate ORM,它读实体类字段,用反射来映射数据库表。
动态代理:
AOP编程,用动态代理加日志、权限等功能。
插件化系统:
运行时加载JAR包里的类,做功能增加。
测试工具:
单元测试框架像 JUnit 用反射自动找并执行测试方法。
五,Java反射好坏处分析
优点:
灵活度很高;能运行中操作类和对象,满足复杂业务。
代码复用性很高,反射能做出通用的工具,例如 JSON 序列化。
支持动态加载,不需要重启应用,马上就能加新模块。
缺点:
性能开销高:反射操作慢于直接调用,因要解析元数据。
破坏封装:能进入私有成员,或让设计抽象乱套。
可读性差:反射用多了,代码就难读懂,也难维护。
六、Java反射的使用技巧
合理使用反射:
性能敏感代码别老用反射,比如常被调用的方法。
框架开发时要先用反射,业务逻辑里最好别用。
优化反射性能:
缓存Class、Method,能减少查找时间。
用 setAccessible(true) 提升私有成员访问;但小心安全出问题。
安全控制:
在敏感环境,要限制反射访问私有成员。
别用反射调用危险方法,比如 System.exit。
七,Java反射实战例子
案例:动态建对象,然后调方法
Java
深色版本
// 定义一个简单类
public class 计算器 {
public int add(int a , int b){
return a与b的和;
}
}
// 反射调用示例
public class DemoReflection {
public static void main(String args[])Exception {
得到类 对象
Class clazz = ClassforName("Calculator");
// 创建对象实例
Object calc = clazz.getConstructor().create();
// 调用 add 方法
Method add = clazz.getMethod("add", int, int);
int result=addMethod.invoke(calculator,5,3)(int);
System.out.println("加的结果:" + result); // 输出8
}
}