一、动态代理API
1.JDK的动态代理
Object proxyObject = Proxy.newProxyInstance(类加载器, Class[] 接口, new InvocationHandler(){
public Object invoke(Object proxy, Method method, Object[] args){
//前置增强
//可以调用目标对象的method方法完成功能。也可以不调用,由代理对象完成功能
//后置增强
return 返回值;
}
})
2.CGLIB的动态代理
(1)导入依赖:
<dependencies>
<!-- spring的包里已经包含了cglib,可以直接使用。不需要再额外导入cglib -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
</dependencies>
(2)api:
SuperStar proxy = (SuperStar) Enhancer.create(star.getClass(), new MethodInterceptor() {
/**
* 我们调用代理的任何方法,其实执行的都是这个方法
* @param o 最终生成的那个代理对象
* @param method 调用者调用代理对象时,所调用的那个方法
* @param objects 调用者调用代理对象时,所传递的实参值
* @param methodProxy method对象的包装。通过这个对象,可以直接调用父类的方法,而不再反射调用。所以它的性能要强一些
*/
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
//前置增强
System.out.println("前置增强");
//调用目标对象。methodProxy.invokeSuper(代理对象, 方法实参),直接调用代理的父类(目标类)方法
// Object result = method.invoke();
Object result = methodProxy.invokeSuper(o, objects);
//后置增强
System.out.println("后置增强");
return result;
}
});
本文探讨了JDK和CGLIB两种动态代理技术,包括它们的使用方法和主要区别。JDK动态代理基于接口实现,而CGLIB则通过字节码生成代理类。

23万+

被折叠的 条评论
为什么被折叠?



