JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了。CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。JDK动态代理与CGLib动态代理均是实现Spring AOP的基础。
简单的实现举例:
这是一个需要被代理的类,也就是父类,通过字节码技术创建这个类的子类,实现动态代理。
public class SayHello {
public void say(){
System.out.println("hello everyone");
}
}
该类实现了创建子类的方法与代理的方法。getProxy(SuperClass.class)方法通过入参即父类的字节码,通过扩展父类的class来创建代理对象。intercept()方法拦截所有目标类方法的调用,obj表示目标类的实例,method为目标类方法的反射对象,args为方法的动态入参,proxy为代理类实例。proxy.invokeSuper(obj, args)通过代理类调用父类中的方法。
public class CglibProxy implements MethodInterceptor{
private Enhancer enhancer = new Enhancer();
public Object getProxy(Class clazz){
//设置需要创建子类的类
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
//通过字节码技术动态创建子类实例
return enhancer.create();
}
//实现MethodInterceptor接口方法
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.out.println("前置代理");
//通过代理类调用父类中的方法
Object result = proxy.invokeSuper(obj, args);
System.out.println("后置代理");
return result;
}
}
具体实现类:
public class DoCGLib {
public static void main(String[] args) {
CglibProxy proxy = new CglibProxy();
//通过生成子类的方式创建代理类
SayHello proxyImp = (SayHello)proxy.getProxy(SayHello.class);
proxyImp.say();
}
}
输出结果:
前置代理
hello everyone
后置代理
cglib 与jdk动态代理区别
CGLib创建的动态代理对象性能比JDK创建的动态代理对象的性能高不少,但是CGLib在创建代理对象时所花费的时间却比JDK多得多,所以对于单例的对象,因为无需频繁创建对象,用CGLib合适,反之,使用JDK方式要更为合适一些。同时,由于CGLib由于是采用动态创建子类的方法,对于final方法,无法进行代理
相关推荐
本文将深入探讨如何在基于Maven的项目中利用CGLib库实现动态代理。CGLib(Code Generation Library)是Java中一个高性能的代码生成库,它在运行期通过字节码技术为类创建子类,以此实现动态代理。 1. Maven项目配置...
- **CGLIB代理**适用于目标类没有接口或者不希望修改原有接口的情况,其性能通常优于JDK代理,因为它是基于字节码生成的子类,而JDK代理需要反射调用接口方法。 在实际开发中,如Spring AOP框架就同时支持JDK和...
JDK和CGLIB是Java中实现动态代理的两种主要方式,它们在Spring框架中扮演着关键角色,尤其是在AOP(面向切面编程)中。 1. **JDK动态代理**: JDK动态代理基于Java的接口机制实现,因此,要使用JDK动态代理,被...
CGlib则是Java动态代理的一种实现方式,尤其是在不提供接口的情况下,它通过生成目标类的子类来实现动态代理。 在Java中,JDK自带的动态代理机制是基于接口的,如果被代理的类没有实现任何接口,那么就无法使用JDK...
以下是使用CGlib实现动态代理的关键步骤: 1. 引入依赖:在项目中,需要引入CGlib的相关库,通常是在Maven或Gradle的配置文件中添加对应的依赖。 2. 创建Enhancer对象:Enhancer是CGlib的核心类,它提供了创建代理...
1. `cglib-nodep-2.1_3.jar`:这是CGlib的主要库,包含了实现动态代理所需的所有类和方法,不依赖于其他外部库,如ASM。 2. `asm-2.2.3.jar`:ASM是一个Java字节码操控和分析框架,用于生成和修改类的字节码。CGlib...
### 动态代理原理 动态代理是一种编程技术,允许在运行时创建一个实现了特定接口的新类。在Java中,有两种主要的动态代理方式:JDK的`java.lang.reflect.Proxy`和第三方库如CGlib。JDK的Proxy需要目标类实现至少一个...
**CGlib动态代理原理** CGlib动态代理基于ASM库来操作Java字节码,当目标对象没有实现接口时,CGlib可以创建目标对象的子类,并在子类中拦截方法调用。它通过生成的子类重写父类的方法,在被重写的方法内部添加额外...
动态代理和CGLIB在Java开发中扮演着重要的角色,特别是在实现面向切面编程(AOP)和增强对象功能方面。动态代理允许我们在不修改原始代码的情况下,为已有对象添加额外的功能,比如日志记录、性能监控等。而CGLIB...
通过分析`DynamicProxyTest`源码,我们可以更深入地理解JDK和Cglib动态代理的工作原理,以及它们在实际应用中的用法。动态代理在AOP(面向切面编程)、缓存、日志记录、事务管理等多个场景中都有广泛应用,是Java...
CGLib通过字节码技术为类创建子类来实现动态代理,因此,被代理的目标对象不必实现任何接口。CGLib的核心类包括MethodInterceptor接口和Enhancer类。Enhancer类可以看作是CGLib的工厂,它通过反射机制获取目标类,并...
这个“cglib实现动态代理依赖jar包”包含了两个核心的JAR文件:asm-5.1.jar和cglib-3.2.4.jar。 **ASM库**: ASM是一个字节码操控和分析框架,它可以直接生成和修改Java类和Android Dalvik字节码。ASM库主要用在...
CGlib动态代理的工作原理是通过ASM库来操作字节码,动态创建一个目标类的子类,并重写其中的方法。当调用代理对象的方法时,实际上会执行由Enhancer生成的子类方法,这个子类会包含原始方法的调用以及额外的增强逻辑...
Cglib动态代理是Java开发中常用的一种技术,它允许我们为现有的类创建子类,并在子类中拦截方法调用。Cglib库通常与Spring框架一起使用,用于实现AOP(面向切面编程)的功能,如事务管理、日志记录等。在这个场景下...
CGLIB是通过字节码技术来实现动态代理的。当我们的应用程序需要动态地创建一个类的实例或者需要在运行时扩展一个类的功能时,CGLIB就能派上用场。它通过字节码技术生成一个类的子类,并在这个子类中添加额外的方法来...
然后,在Spring配置文件中启用CGLIB代理,可以设置`proxy-target-class="true"`属性: ```xml <!-- 配置切面 --> ... ``` 接下来,创建一个需要代理的目标类,例如`TargetService`,并定义一个或多个方法: `...
1. **原理**:CGLIB通过ASM库在运行时动态生成一个目标类的子类,从而实现对目标对象的方法拦截。这个子类重写了目标类的所有非final方法,并在这些方法内部调用拦截器链。 2. **过程**:CGLIB使用`Enhancer`类作为...
总结,JDK动态代理和CGLIB是Java中实现动态代理的两种主要方式。JDK代理基于接口,适用于简单场景;CGLIB通过字节码技术,适用于更复杂的需求。开发者可以根据项目需求选择合适的方法。对于学习和理解这两种动态代理...
2. 设置回调函数,即MethodInterceptor,这是CGLib实现动态代理的关键,它定义了当代理对象调用方法时执行的逻辑。 3. 调用Enhancer的create()方法,生成代理对象。 在Spring AOP中,CGLib通过Enhancer和...
在Java编程领域,动态代理和Cglib代理是两种常用的技术,用于在运行时创建对象的代理,以实现额外的功能,如AOP(面向切面编程)中的日志、事务管理等。本篇文章将深入探讨这两种代理机制,尤其是Cglib代理。 首先...