在Java中实现动态代理可以使用代理接口和InvocationHandler接口。首先需要定义一个代理接口,然后通过Proxy.newProxyInstance()方法动态地创建出一个代理对象,并将代理接口和InvocationHandler接口传入该方法。当调用代理对象的方法时,实际上会调用InvocationHandler.invoke()方法,该方法接收方法对象和参数,开发者可以在该方法中实现对目标对象的访问控制和增强。
以下是动态代理的示例代码:
public interface Subject {
void doSomething();
}
public class RealSubject implements Subject {
@Override
public void doSomething() {
System.out.println("RealSubject doSomething...");
}
}
public class ProxyHandler implements InvocationHandler {
private Object target;
public ProxyHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before doSomething...");
Object result = method.invoke(target, args);
System.out.println("After doSomething...");
return result;
}
}
public class Main {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
ProxyHandler proxyHandler = new ProxyHandler(realSubject);
Subject proxySubject = (Subject) Proxy.newProxyInstance(realSubject.getClass().getClassLoader(),
realSubject.getClass().getInterfaces(),
proxyHandler);
proxySubject.doSomething();
}
}
输出结果为:
Before doSomething...
RealSubject doSomething...
After doSomething...
可以看到,当调用代理对象的doSomething()方法时,实际上会执行ProxyHandler.invoke()方法,该方法中实现了对目标对象的访问控制和增强。