java动态代理
java动态代理是AOP的一种实现,构建代理对象速度比cglib快,但运行时效率比cglib慢,只能构建基于接口的对象,并不是被代理对象的子类。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class PerformanceHandler implements InvocationHandler {
private Object target; // 被代理对象
public PerformanceHandler(Object target) {
this.target = target;
}
// 参数中Object proxy并不是被代理对象,而是生成的代理对象,所以无法用proxy去调用method
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(target.getClass());
// 在实际对象方法调用前调用其他方法
PerformanceMonitor.begin(target.getClass().getName() + "." + method.getName());
Object obj = method.invoke(target, args);
// 在实际对象方法调用后调用其他方法
PerformanceMonitor.end();
return obj;
}
}
import java.lang.reflect.Proxy;
public class TestForumService {
public static void main(String[] args) {
ForumService target = new ForumServiceImpl();
PerformanceHandler handler = new PerformanceHandler(target);
ForumService proxy = (ForumService) Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
handler);
proxy.removeForum(10);
proxy.removeTopic(1012);
}
}
动态代理的方法定义如下:
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h);
所以传入的是需要代理对象继承的接口。
生成的对象是继承自Object以及接口的对象,而不是被代理对象的子类。