cglib实现动态代理
时间: 2023-09-03 14:14:00 浏览: 66
JDK动态代理和CGLIB动态代理都是Java中的动态代理技术,但它们的实现方式不同。
JDK动态代理是基于接口的代理,它要求被代理的类必须实现一个接口,代理类实现该接口并在代理类中调用被代理类的方法。JDK动态代理使用Java自带的反射机制实现,因此它的效率比较高。
CGLIB动态代理是基于继承的代理,它不要求被代理的类实现接口,代理类继承被代理类并重写被代理类的方法。CGLIB动态代理使用ASM框架实现,因此它的效率比JDK动态代理略低,但它可以代理没有实现接口的类。
总的来说,JDK动态代理适用于代理实现了接口的类,而CGLIB动态代理适用于代理没有实现接口的类。
相关问题
cglib实现动态代理 代码实现
cglib是一个强大的Java字节码处理库,它可以在运行时生成一个被代理类的子类,并且拦截目标方法,实现动态代理。
下面是一个简单的cglib实现动态代理的代码实例:
```
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class CglibProxy implements MethodInterceptor {
private Object target;
public Object getInstance(final Object target) {
this.target = target;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.target.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("before " + method.getName() + " method execute!");
Object result = proxy.invokeSuper(obj, args);
System.out.println("after " + method.getName() + " method execute!");
return result;
}
public static void main(String[] args) {
CglibProxy cglibProxy = new CglibProxy();
UserServiceImpl userService = (UserServiceImpl) cglibProxy.getInstance(new UserServiceImpl());
userService.addUser();
}
}
```
在上面的代码中,CglibProxy类实现了MethodInterceptor接口,并实现了intercept方法,用于拦截目标方法的调用。在main方法中,我们可以看到通过cglib Proxy获取了UserServiceImpl的代理对象,并且成功地调用了addUser方法。
希望这个例子能够帮助你更好地理解cglib实现动态代理的原理以及代码实现。
cglib动态代理实现
CGLIB是一个强大的、高性能的代码生成库,它被广泛应用于AOP框架。CGLIB底层使用ASM来操作字节码生成新的类,以控制对象的访问。相比于JDK动态代理,CGLIB更加强大,因为它既可以代理普通类,也能够代理接口。
CGLIB的工作原理如下:
1. 首先,创建一个代理对象。
2. 调用代理对象的方法,例如`proxy.doFly()`。
3. 在调用方法时,会调用MethodInterceptor的intercept方法,这里就是调用我们的CglibProxy。
4. 在CglibProxy的intercept方法中,调用`methodProxy.invokeSuper(o, params)`,这里就是要调用被代理类的原始方法。
5. 在初始化阶段,会生成代理类和被代理类的FastClass。
6. 调用生成的代理类的方法,例如`CGLIB$doFly$0()`,这里会调用被代理类的方法。
总结起来,CGLIB通过生成代理类来帮助我们调用被代理类的方法,生成的代理类继承了被代理类,并在调用方法时通过调用super来调用被代理类的方法。