- 作者:老汪软件技巧
- 发表时间:2024-09-20 15:02
- 浏览量:
1.什么是反射?
Java 反射(Reflection)允许程序在运行时动态获取类的信息、访问类的成员和方法、创建类的实例等。尽管反射的性能不如直接调用高,但其灵活性使得反射在许多场景中非常有用。
2.反射主要应用场景1. 框架设计与实现
许多 Java 框架利用反射来实现高度的灵活性和动态功能,例如:
2. 动态代理
Java 的动态代理使用反射来拦截方法调用并执行特定逻辑。在动态代理中,通过 Proxy 类和 InvocationHandler 接口,可以在运行时创建代理对象,并在方法调用时通过反射将调用转发给实际对象。这种方式被广泛应用于 AOP(如事务管理、日志记录、权限控制等场景)。 应用场景:
3. 依赖注入
依赖注入是一种设计模式,反射在依赖注入框架中非常重要。框架可以使用反射自动创建对象并注入到需要的地方。 应用场景:
4. 动态创建对象和调用方法
反射允许在运行时动态地创建类实例和调用其方法,而不需要在编译时确定类的类型。这对于开发高度通用的库或工具非常有帮助。 应用场景:
5. 类加载与动态模块
通过反射,开发者可以实现自定义类加载器,在运行时根据需求加载类。这对于构建支持插件、模块化、动态更新的系统非常有用。 应用场景:
6. 序列化与反序列化
在 Java 的序列化和反序列化过程中,反射用于读取对象的内部状态并将其还原。这在许多数据传输、持久化和缓存框架中是不可或缺的。 应用场景:
7. 开发通用工具与库
反射允许开发通用的工具类或库,而不依赖于具体的实现类。例如,泛型工具、对象拷贝工具、Bean 属性操作工具等都可以通过反射来实现。 应用场景:
8. 调试和测试工具
反射被广泛用于开发调试和测试工具,允许这些工具在不修改代码的情况下,查看和修改程序的内部状态。 应用场景:
9. 注解处理
反射能够帮助处理运行时注解,通过反射获取类、方法、字段上的注解信息,并执行相应的处理逻辑。 应用场景:
10. 获取和修改私有成员
反射允许程序在运行时访问类的私有字段、方法等,这是通常情况下通过直接调用不允许的。
3.代码工程实验目标
通过反射实现动态代理
service
package com.et;
interface Service {
void perform();
}
package com.et;
class RealService implements Service {
@Override
public void perform() {
System.out.println("Real Service is performing...");
}
}
代理
package com.et;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
class DynamicProxyHandler implements InvocationHandler {
private Object realObject;
// construct
public DynamicProxyHandler(Object realObject) {
this.realObject = realObject;
}
// method invoker
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before method: " + method.getName());
//invoker the real method
Object result = method.invoke(realObject, args);
System.out.println("After method: " + method.getName());
return result;
}
}
以上只是一些关键代码,所有代码请参见下面代码仓库
代码仓库4.测试
编写测试类
package com.et;
import java.lang.reflect.Proxy;
public class DynamicProxyExample {
public static void main(String[] args) {
// real service
RealService realService = new RealService();
// create Dynamic proxy
Service proxyInstance = (Service) Proxy.newProxyInstance(
realService.getClass().getClassLoader(), // classloader
realService.getClass().getInterfaces(), // interface
new DynamicProxyHandler(realService) // real class
);
// invoke
proxyInstance.perform();
}
}
执行main方法
Before method: perform
Real Service is performing...
After method: perform
5.引用