在Java中,动态代理是一种强大的机制,允许你在运行时创建一个实现了一组接口的新类。动态代理通常用于实现AOP(面向切面编程)、事件监听、事务管理等场景。下面是一个使用Java反射实现动态代理的简单示例。
定义接口:首先,你需要定义一个或多个接口,代理类将实现这些接口。
创建InvocationHandler:实现InvocationHandler接口,这个接口有一个方法invoke,它会在代理对象的方法被调用时执行。
创建代理对象:使用Proxy.newProxyInstance方法创建代理对象。
public interface Calculator {
int add(int a, int b);
int subtract(int a, int b);
}
public class CalculatorImpl implements Calculator {
@Override
public int add(int a, int b) {
return a + b;
}
@Override
public int subtract(int a, int b) {
return a - b;
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class CalculatorInvocationHandler implements InvocationHandler {
private Object target;
public CalculatorInvocationHandler(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;
}
}
import java.lang.reflect.Proxy;
public class DynamicProxyDemo {
public static void main(String[] args) {
// 创建目标对象
Calculator target = new CalculatorImpl();
// 创建InvocationHandler
CalculatorInvocationHandler handler = new CalculatorInvocationHandler(target);
// 创建代理对象
Calculator proxy = (Calculator) Proxy.newProxyInstance(
Calculator.class.getClassLoader(),
new Class<?>[] { Calculator.class },
handler
);
// 使用代理对象调用方法
int resultAdd = proxy.add(3, 5);
System.out.println("Result of add: " + resultAdd);
int resultSubtract = proxy.subtract(10, 4);
System.out.println("Result of subtract: " + resultSubtract);
}
}
定义接口:Calculator接口定义了两个方法add和subtract。
实现接口:CalculatorImpl类实现了Calculator接口。
创建InvocationHandler:CalculatorInvocationHandler类实现了InvocationHandler接口,并在invoke方法中添加了前置和后置处理逻辑。
创建代理对象:在DynamicProxyDemo类中,使用Proxy.newProxyInstance方法创建了一个代理对象。这个方法需要三个参数:
通过这种方式,你可以在运行时动态地创建代理对象,并在方法调用前后添加额外的逻辑。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。