Java反射机制理解不足:动态代理实例
在Java中,反射机制是一种强大的工具,它允许我们在运行时检查类、字段和方法等信息,并对其进行操作。
动态代理是反射机制的一个重要应用。动态代理的主要目的是实现对目标对象的拦截,从而在不改变原代码的前提下,增加额外的功能。
例如,我们有一个服务接口(Service Interface):
public interface Service {
void doSomething();
}
然后我们可以创建一个动态代理类,使用JDK提供的Proxy和InvocationHandler来实现:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
// 假设我们有一个实际的Service实现
public class RealServiceImpl implements Service {
@Override
public void doSomething() {
System.out.println("Doing something...");
}
}
// 动态代理类
class DynamicProxy implements InvocationHandler {
private final Object target;
// 创建动态代理实例,目标为真实服务对象
public DynamicProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before method execution...");
// 执行原方法
method.invoke(target, args);
System.out.println("After method execution...");
return null;
}
}
// 测试:创建代理对象,调用方法
public class Main {
public static void main(String[] args) {
// 创建真实服务对象
Service realService = new RealServiceImpl();
// 通过反射获取真实服务类中doSomething()方法
Method method = Service.class.getMethod("doSomething");
// 创建动态代理实例,目标为真实服务对象
DynamicProxy proxy = new DynamicProxy(realService);
// 使用代理对象调用方法
Object result = proxy.invoke(null, method, null));
System.out.println("Result: " + result);
}
}
当你运行这个测试类时,你会看到在执行doSomething()
方法前后输出的信息。这正是动态代理的体现:不改变目标代码,增加额外的功能。
还没有评论,来说两句吧...