当然,我可以为你提供一个简单的Java动态代理示例。在这个示例中,我们将使用`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`来创建一个动态代理。
首先,定义一个接口,这个接口将被代理类实现:
public interface Subject {
void request();
}
然后,实现这个接口的一个真实类:
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("Calling RealSubject.request()");
}
}
接下来,创建一个实现了`InvocationHandler`接口的类,这个类将负责在调用被代理对象的方法时插入自定义的行为:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class DynamicProxyHandler implements InvocationHandler {
private Object subject;
public DynamicProxyHandler(Object subject) {
this.subject = subject;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 在调用真实对象的方法之前执行
System.out.println("Before method " + method.getName());
// 调用真实对象的方法
Object result = method.invoke(subject, args);
// 在调用真实对象的方法之后执行
System.out.println("After method " + method.getName());
return result;
}
}
最后,我们使用`Proxy`类来创建一个动态代理对象,并调用它的方法:
import java.lang.reflect.Proxy;
public class ProxyDemo {
public static void main(String[] args) {
// 创建真实对象
RealSubject realSubject = new RealSubject();
// 创建处理器
DynamicProxyHandler handler = new DynamicProxyHandler(realSubject);
// 获取被代理对象的类加载器
ClassLoader classLoader = realSubject.getClass().getClassLoader();
// 获取被代理对象实现的接口数组
Class<?>[] interfaces = realSubject.getClass().getInterfaces();
// 创建动态代理对象
Subject subjectProxy = (Subject) Proxy.newProxyInstance(
classLoader,
interfaces,
handler
);
// 调用代理对象的方法
subjectProxy.request();
}
}
在这个示例中,当调用`subjectProxy.request()`时,实际上会先调用`DynamicProxyHandler`的`invoke`方法,在`invoke`方法中我们可以添加任何自定义的逻辑,然后调用真实对象的方法。这样就实现了在不修改真实类代码的情况下,为其添加额外的功能。