在 Java 中,动态代理是通过反射机制实现的,主要用于在运行时创建一个实现某些接口的代理类对象。动态代理的主要作用是将对象的所有方法调用转发到代理类上进行处理,可以通过代理类的对象来访问方法,并在访问实际对象之前或之后执行某些操作。
使用 Java 反射机制创建动态代理需要用到 java.lang.reflect.Proxy 类,以及 java.lang.reflect.InvocationHandler 接口。
InvocationHandler 接口只有一个方法 invoke,该方法在代理对象的方法被调用时被调用。invoke 方法需要三个参数:代理对象、被调用的方法以及方法的参数。
下面是一个简单的示例:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface ICalculator {
int add(int a, int b);
}
class Calculator implements ICalculator {
@Override
public int add(int a, int b) {
return a + b;
}
}
class CalculatorProxy implements InvocationHandler {
private ICalculator target;
public CalculatorProxy(ICalculator target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before invoking method " + method.getName());
Object result = method.invoke(target, args);
System.out.println("After invoking method " + method.getName());
return result;
}
}
public class Main {
public static void main(String[] args) {
Calculator calculator = new Calculator();
CalculatorProxy proxy = new CalculatorProxy(calculator);
ICalculator calculatorProxy = (ICalculator) Proxy.newProxyInstance(
ICalculator.class.getClassLoader(),
new Class<?>[]{ICalculator.class},
proxy
);
System.out.println(calculatorProxy.add(1, 2));
}
}
在这个例子中,CalculatorProxy 类实现了 InvocationHandler 接口,它接收一个 ICalculator 接口类型的对象 target,并在 invoke 方法中添加了前置和后置操作。
在 main 方法中,我们首先创建一个实际的 Calculator 对象,然后创建一个代理对象 proxy,并将实际对象传递给它。最后,我们使用 Proxy.newProxyInstance 方法创建了一个 ICalculator 接口类型的代理对象 calculatorProxy,该对象在调用 add 方法时将调用 CalculatorProxy 中的 invoke 方法。在 invoke 方法中,我们可以添加前置和后置操作,然后调用实际对象的方法。