完整代码案例给出一个使用JDK动态代理的例子。
时间: 2024-02-03 13:14:21 浏览: 23
好的,这里给出一个使用JDK动态代理的简单示例:
首先,定义一个接口:
```
public interface Calculator {
int add(int a, int b);
}
```
接着,定义一个实现该接口的类:
```
public class CalculatorImpl implements Calculator {
@Override
public int add(int a, int b) {
return a + b;
}
}
```
然后,定义一个动态代理类:
```
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class CalculatorProxy implements InvocationHandler {
private Object target;
public CalculatorProxy(Object target) {
this.target = target;
}
public Object getProxy() {
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
this
);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before method " + method.getName() + " invoked");
Object result = method.invoke(target, args);
System.out.println("After method " + method.getName() + " invoked");
return result;
}
}
```
在该类中,我们实现了`InvocationHandler`接口,重写了其`invoke`方法,在方法前后加上了日志输出。`getProxy`方法返回代理对象。
最后,编写测试用例:
```
public class TestCalculator {
public static void main(String[] args) {
Calculator calculator = new CalculatorImpl();
CalculatorProxy proxy = new CalculatorProxy(calculator);
Calculator proxyObj = (Calculator) proxy.getProxy();
System.out.println(proxyObj.add(1, 2));
}
}
```
运行该测试用例,将输出如下结果:
```
Before method add invoked
After method add invoked
3
```
可以看到,我们成功地使用JDK动态代理对`Calculator`接口的方法进行了拦截,并在方法前后添加了日志。