Java 如何实现动态代理?
动态代理是一种运行时生成代理类的机制,能够在代理类中处理被代理类的方法调用。Java中的动态代理主要通过 java.lang.reflect 包中的 Proxy 类和 InvocationHandler 接口来实现。
首先,我们需要编写一个 InvocationHandler 接口的实现类来实现具体的代理逻辑。以下是一个简单的例子:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyInvocationHandler implements InvocationHandler {
private 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 invoking " + method.getName());
Object result = method.invoke(target, args);
System.out.println("After invoking " + method.getName());
return result;
}
}
这里的 MyInvocationHandler 类实现了 InvocationHandler 接口,并通过构造函数传入一个被代理对象。在 invoke 方法中,我们可以对被代理对象的方法调用进行处理。
接下来,我们可以使用 Proxy 类来生成代理对象。以下是一个示例:
import java.lang.reflect.Proxy;
public class Main {
public static void main(String[] args) {
// 创建被代理对象
RealSubject realSubject = new RealSubject();
// 创建代理对象
MyInvocationHandler handler = new MyInvocationHandler(realSubject);
Subject proxy = (Subject) Proxy.newProxyInstance(RealSubject.class.getClassLoader(),
RealSubject.class.getInterfaces(),
handler);
// 调用代理对象的方法
proxy.request();
}
}
这里,我们使用 Proxy.newProxyInstance 方法创建代理对象,传入类加载器、被代理对象实现的接口以及实现了 InvocationHandler 接口的 MyInvocationHandler 对象。最后,我们调用代理对象的方法来触发代理逻辑。
总之,Java中实现动态代理的方式是使用 Proxy 类和 InvocationHandler 接口来生成代理类,并通过代理类来处理被代理对象的方法调用。