// Java动态代理示例代码
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
// 定义一个接口
interface Service {
void performTask();
}
// 实现该接口的类
classServiceImpl implements Service {
@Override
public void performTask() {
System.out.println("Executing task inServiceImpl.");
}
}
// 自定义InvocationHandler实现类
classServiceInvocationHandler implements InvocationHandler {
private Object target;
publicServiceInvocationHandler(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 serviceImpl = newServiceImpl();
// 创建InvocationHandler
ServiceInvocationHandler handler = newServiceInvocationHandler(serviceImpl);
// 通过Proxy为指定接口创建动态代理实例
Service proxyInstance = (Service) Proxy.newProxyInstance(
serviceImpl.getClass().getClassLoader(),
new Class[]{Service.class},
handler
);
// 调用代理对象的方法
proxyInstance.performTask();
}
}
接口定义:Service 接口定义了一个 performTask 方法,这是我们要代理的目标方法。
实现类:ServiceImpl 类实现了 Service 接口,并提供了一个具体实现。
InvocationHandler 实现:ServiceInvocationHandler 类实现了 InvocationHandler 接口。它负责在调用代理对象的方法时执行额外的逻辑(如日志记录)。invoke 方法会在每次调用代理对象的方法时被触发。
动态代理创建:在 DynamicProxyExample 类中,我们使用 Proxy.newProxyInstance 方法为 Service 接口创建一个动态代理实例。这个代理实例会拦截所有对 performTask 方法的调用,并通过 ServiceInvocationHandler 来处理这些调用。
调用代理对象的方法:最后,我们通过代理对象调用 performTask 方法,可以看到控制台输出了前置和后置的日志信息。
通过这种方式,Java 动态代理可以在不修改原有代码的情况下,灵活地添加额外的功能(如日志、事务管理等)。
上一篇:javaswing是什么意思
下一篇:java获取list某个字段的值
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站