下面是一个简单的Java JDK动态代理的应用案例。在这个例子中,我们将创建一个接口,一个实现了这个接口的类,然后使用`java.lang.reflect.Proxy`类来创建一个该接口的动态代理实例。这个代理实例将在调用接口方法时添加一些额外的逻辑(比如日志记录)。
首先,定义一个接口:
public interface Subject {
void request();
}
然后,实现这个接口:
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject: Handling 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;
}
}
最后,我们创建一个客户端类来生成代理实例并调用方法:
import java.lang.reflect.Proxy;
public class ProxyDemo {
public static void main(String[] args) {
// 创建原始对象
RealSubject realSubject = new RealSubject();
// 创建InvocationHandler,并传入原始对象
InvocationHandler handler = new DynamicProxyHandler(realSubject);
// 使用Proxy类生成代理对象
// 第一个参数是类加载器,第二个参数是接口数组,第三个参数是handler
Subject proxyInstance = (Subject) Proxy.newProxyInstance(
realSubject.getClass().getClassLoader(),
new Class[]{Subject.class},
handler
);
// 调用代理实例的方法
proxyInstance.request();
}
}
在这个例子中,`RealSubject`类实现了`Subject`接口,并定义了`request`方法的具体实现。`DynamicProxyHandler`类实现了`InvocationHandler`接口,用于在调用`Subject`接口的方法前后添加额外的逻辑(这里是打印日志)。最后,`ProxyDemo`类使用`Proxy.newProxyInstance`方法创建了一个`Subject`接口的动态代理实例,并通过这个代理实例调用了`request`方法。由于调用是通过代理实例进行的,所以`DynamicProxyHandler`中的`invoke`方法会被调用,从而实现了在方法调用前后添加额外逻辑的目的。