// Java 动态代理示例代码
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
// 定义一个接口
interface Service {
void execute();
}
// 实现该接口的类
class RealService implements Service {
@Override
public void execute() {
System.out.println("Executing RealService");
}
}
// 自定义的 InvocationHandler,用于处理代理对象的方法调用
class MyInvocationHandler implements InvocationHandler {
private final Object target;
public MyInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before method: " + method.getName());
Object result = method.invoke(target, args);
System.out.println("After method: " + method.getName());
return result;
}
}
public class DynamicProxyExample {
public static void main(String[] args) {
// 创建目标对象
Service realService = new RealService();
// 创建代理对象
Service proxyService = (Service) Proxy.newProxyInstance(
realService.getClass().getClassLoader(),
realService.getClass().getInterfaces(),
new MyInvocationHandler(realService));
// 调用代理对象的方法
proxyService.execute();
}
}
Service
是一个简单的接口,包含一个 execute()
方法。RealService
实现了 Service
接口,并在 execute()
方法中输出一条消息。MyInvocationHandler
实现了 InvocationHandler
接口,重写了 invoke()
方法。在这个方法中,我们可以在目标方法执行前后添加额外的逻辑(如日志记录)。Proxy.newProxyInstance()
方法创建了一个代理对象 proxyService
,它实现了与 RealService
相同的接口。proxyService.execute()
时,实际上会触发 MyInvocationHandler
中的 invoke()
方法,从而实现对方法调用的拦截和增强。这段代码展示了如何使用 Java 的动态代理机制来拦截和增强方法调用。
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站