JDK自从1.3版本开始,就引入了动态代理,JDK的动态代理用起来非常简单,但是它有一个限制,就是使用动态代理的对象必须实现一个或多个接口 。如果想代理没有实现接口的类可以使用CGLIB包。
CGLIB是一个强大的高性能的代码生成包。它被许多AOP的框架(例如Spring AOP)使用,为他们提供方法的interception(拦截)。Hibernate也使用CGLIB来代理单端single-ended(多对一和一对一)关联。EasyMock通过使用模仿(moke)对象来测试java代码的包。它们都通过使用CGLIB来为那些没有接口的类创建模仿(moke)对象。
CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类。不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉
以下为模拟案例,在使用CGLIB时需引入cglib-nodep-2.1_3.jar包
简单的使用方法
Enhancer中有几个常用的方法, setSuperClass和setCallback, 设置好了SuperClass后, 可以使用create制作代理对象了
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(EnhancerDemo.class);
enhancer.setCallback(new MethodInterceptorImpl());
EnhancerDemo demo = (EnhancerDemo) enhancer.create();
实现MethodInterceptor接口
private static class MethodInterceptorImpl implements MethodInterceptor {
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.out.println("Before invoke " + method);
Object result = proxy.invokeSuper(obj, args);
System.out.println("After invoke" + method);
return result;
}
}
intercept方法, Object result = proxy.invokeSuper(obj, args)调用了原来的方法, 在这个调用前后可以添加其他的逻辑, 相当于AspectJ的around
完整代码如下:
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class EnhancerDemo {
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(EnhancerDemo.class);
enhancer.setCallback(new MethodInterceptorImpl());
EnhancerDemo demo = (EnhancerDemo) enhancer.create();
demo.test();
System.out.println(demo);
}
public void test() {
System.out.println("EnhancerDemo test()");
}
private static class MethodInterceptorImpl implements MethodInterceptor {
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.err.println("Before invoke " + method);
Object result = proxy.invokeSuper(obj, args);
System.err.println("After invoke" + method);
return result;
}
}
}
相关推荐
例如,`net.sf.cglib.proxy.Enhancer`是CGLIB中最常用的类,它可以用来创建代理对象。同时,`net.sf.cglib.core.Predicate`和`net.sf.cglib.core.KeyFactory`等类也是实现代理功能的重要组件。 2. asm.jar:ASM是一...
因此,在实际开发中通常建议使用像 CGLIB 这样的高级抽象层,以简化字节码操作的过程。 #### 图1: CGLIB 库及其与其他框架的关系 该图展示了 CGLIB 库与一些流行的框架之间的关系,包括但不限于 Spring AOP 和 ...
在Spring框架中,CGLib被用作AOP代理的一个重要组件,特别是在没有实现接口的类上创建代理对象时,Spring会默认使用CGLib。 CGLib的工作原理是基于ASM库,ASM是一个字节码操作和分析框架,它可以用来动态生成类或...
下面我们将详细讲解Cglib代理的工作原理以及如何在实际项目中使用。 1. **Cglib代理原理**: - Cglib通过ASM库动态生成一个子类,这个子类继承自目标类,并重写其中的方法。 - 在生成的子类中,每个被代理的方法...
现在,我们来详细探讨如何简单模拟Spring框架中的CGLIB代理。要进行模拟,首先需要了解CGLIB代理的核心实现原理,包括代理类的生成、方法拦截和回调机制等。 1. 代理类的生成 CGLIB使用Enhancer类来生成代理对象。...
在Spring中,如果你选择使用基于代理的事务管理,且目标类不实现接口,Spring就会默认使用CGLib来创建代理。通过代理,可以在方法调用前后插入额外的逻辑,如事务控制、性能监控等。 CGLib的使用通常涉及到以下几个...
在Java中,由于无法直接继承final类或者重写final方法,CGlib提供了一种解决方案,使得我们能够在运行时动态地扩展或修改类的行为。 CGlib的核心是ASM库,ASM是一个底层的Java字节码操纵和分析框架,可以用来动态...
在Cglib中,我们可以使用Enhancer类来创建代理对象,Enhancer提供了丰富的API来定制代理行为,比如设置回调函数(Callback)以定义拦截逻辑。 以下是一个简单的Cglib代理使用的例子: ```java import ...
在Spring中,如果没有使用接口,那么默认会使用CGLIB来创建代理,以便在方法调用前后插入切面逻辑。 3. **性能优化**:由于CGLIB是基于字节码操作,所以它的运行效率通常比使用反射更高。特别是在大规模对象创建...
2. **方法拦截器**:CGLIB使用`Enhancer`类来创建代理对象,并通过`Callback`接口实现方法拦截。`Callback`可以是`MethodInterceptor`,在方法调用前后执行自定义逻辑。 3. **字节码生成**:CGLIB通过ASM库生成新的...
2. **配置**:在Spring框架中,如果需要使用CGLIB进行AOP代理,需要在配置文件中启用CGLIB代理,例如在XML配置中添加 `<aop:aspectj-autoproxy/>` 或者在Java配置中使用 `@EnableAspectJAutoProxy(proxyTargetClass ...
开发者在项目中引入此jar包,即可使用Cglib进行动态代理和类增强。 5. **cglib-nodep-3.3.0.jar**:此jar包与前者类似,但“nodep”意味着它不依赖于任何额外的库,如ASM。如果项目中已经包含了ASM库,那么可以选择...
CGLib通过创建目标类的子类并在子类中拦截父类方法调用来实现这一目标。相比Java自带的InvocationHandler接口,CGLib的性能更优,因为它避免了反射的开销,而是直接通过字节码技术来生成和执行代理对象。 【版本...
1. **Enhancer**:CGLib中的核心类,用于创建代理对象。你可以通过`Enhancer`设置回调函数、目标对象、父类等,然后调用`enhance()`方法生成代理对象。 2. **Callback**:CGLib提供了一系列的回调接口,如`...
CGLib,全称Code Generation Library,是一个强大的高性能的代码生成库,它在Java世界中被广泛使用,特别是在动态代理和AOP(面向切面编程)领域。这个库允许开发者在运行时动态创建类或者增强已有类的功能。在本篇...
下面是一个简单的CGLIB使用示例: ```java import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; ...
在Spring中,当目标类没有实现任何接口时,Spring会选择使用CGlib来创建代理,实现事务管理、日志记录等功能。此外,CGlib也被ORM框架如Hibernate用于动态生成实体类的代理,以便实现懒加载和其他优化策略。 总的来...
- 在CGLIB的源码中,`net.sf.cglib.proxy.Enhancer`是核心类,负责生成代理对象。它内部会使用ASM来创建子类,并通过`MethodProxy`对象来调用原方法。 - `net.sf.cglib.proxy.MethodInterceptor`接口定义了拦截器...
2. **接口回调**:对于接口,CGLib可以使用`Enhancer`类配合`Callback`接口来创建代理对象。这种方式更加灵活,但要求目标类必须实现至少一个接口。 关键组件和接口包括: - **Enhancer**:这是CGLib的主要入口点...