Java中动态代理技术的理解与实践示例
Java中的动态代理是一种在运行时动态创建代理类和对象的机制。它允许你在不修改原有类代码的情况下,增加额外的功能。动态代理主要通过java.lang.reflect.Proxy
类和java.lang.reflect.InvocationHandler
接口来实现。
动态代理的理解1. 代理模式:在软件工程中,代理模式是一种设计模式,它为其他对象提供一个代理以控制对这个对象的访问。
- 动态代理:在Java中,动态代理是指在程序运行时动态创建的代理类,而不是在编译时生成的。
InvocationHandler
接口:这是实现动态代理的核心,所有动态代理类都必须实现这个接口,并重写invoke
方法。Proxy
类:这个类提供了创建代理类和代理实例的方法。
动态代理的实践示例下面是一个简单的动态代理示例,我们将创建一个Calculator
接口和它的实现类,然后使用动态代理来增强其功能。
1.定义接口和实现类```javapublic interface Calculator {
int add(int a, int b);
int subtract(int a, int b);
}
public class SimpleCalculator implements Calculator {
@Override public int add(int a, int b) {
return a + b;
}
@Override public int subtract(int a, int b) {
return a - b;
}
}####2. 创建动态代理类
javaimport java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class CalculatorProxy implements InvocationHandler {
private final Object target;
public CalculatorProxy(Object target) {
this.target = target;
}
@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(“Before method: “ + method.getName());
Object result = method.invoke(target, args);
System.out.println(“After method: “ + method.getName());
return result;
}
public static Calculator getProxy(Calculator calculator) {
return (Calculator) Proxy.newProxyInstance(
calculator.getClass().getClassLoader(),
new Class[]{Calculator.class},
new CalculatorProxy(calculator)
);
}
}####3. 使用动态代理
javapublic class DynamicProxyDemo {
public static void main(String[] args) {
Calculator calculator = new SimpleCalculator();
Calculator proxyCalculator = CalculatorProxy.getProxy(calculator);
System.out.println(“10 +5 = “ + proxyCalculator.add(10,5));
System.out.println(“10 -5 = “ + proxyCalculator.subtract(10,5));
}
}### 输出
Before method: addAfter method: add10 +5 =15Before method: subtractAfter method: subtract10 -5 =5``在这个示例中,
CalculatorProxy类实现了
InvocationHandler接口,并在
invoke方法中添加了在方法调用前后的日志输出。
getProxy方法用于创建代理对象。在
DynamicProxyDemo中,我们创建了一个
SimpleCalculator的实例,并使用
CalculatorProxy.getProxy`方法来获取它的代理,然后通过代理调用方法,可以看到在方法调用前后有额外的日志输出。
动态代理技术使得我们可以在不修改原有类代码的情况下,灵活地增加功能,非常适合于实现如日志记录、事务管理、权限检查等横切关注点。
还没有评论,来说两句吧...