CGLIB(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。Cglib代理也叫作子类代理,它是在内存中构建一个子类对象从而实现对目标对象功能的扩展。
JDK的动态代理有一个限制,就是使用动态代理的对象必须实现一个或多个接口,如果想代理没有实现接口的类,就可以使用Cglib实现。
不能对final类以及final方法进行代理。
定义实现类:
public class UserServiceImpl { public User getUserById(Long id){ return new User(id, "cjm", "123", null); } }
定义基于CGLIB的动态代理类,需要实现MethodInterceptor接口
public class UserServiceImplCGLIB implements MethodInterceptor { @SuppressWarnings("unchecked") public <T> T getInstance(Object target, Class<T> clazz) { //字节码加强器:用来创建动态代理类 Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(target.getClass()); //代理的目标对象 enhancer.setCallback(this); //回调类,在代理类方法调用时会回调Callback类的intercept方法 Object result = enhancer.create(); //创建代理类 System.out.println(result.getClass().getName()); return (T)result; } @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { //对目标方法进行拦截处理 System.out.println("start..."); Object result = proxy.invokeSuper(obj, args); //调用目标类(父类)的方法 System.out.println("end"); return result; } }
测试代码:
public class Test { public static void main(String[] args) { UserServiceImpl userService = new UserServiceImpl(); UserServiceImplCGLIB cglib = new UserServiceImplCGLIB(); UserServiceImpl proxy = cglib.getInstance(userService, UserServiceImpl.class); User user = proxy.getUserById(100L); String username = Optional.of(user).map(u -> u.getUsername()).orElse(""); System.out.println(username); } }
相关推荐
以下是使用CGlib实现动态代理的关键步骤: 1. 引入依赖:在项目中,需要引入CGlib的相关库,通常是在Maven或Gradle的配置文件中添加对应的依赖。 2. 创建Enhancer对象:Enhancer是CGlib的核心类,它提供了创建代理...
Spring AOP默认使用JDK动态代理,但如果目标类没有实现接口,它会自动切换到CGLIB。在"通过Configuration文件实现AOP.docx"文档中,可能会详细讲述如何在Spring配置文件中配置AOP代理,包括如何选择使用JDK动态代理...
JDK和CGlib是两种常用的动态代理实现方式,它们各自有不同的特性和使用场景。 首先,我们来详细了解一下JDK动态代理。JDK动态代理基于接口实现,它要求被代理的对象必须实现至少一个接口。通过`java.lang.reflect....
性能方面,CGLIB通常比JDK动态代理更快,因为它是基于字节码生成的子类,而JDK动态代理需要创建接口的实现类。但是,如果目标类已经实现了接口,JDK动态代理的性能开销相对较小,因为它避免了子类继承带来的额外成本...
当我们有一个接口和它的实现类,我们可以通过动态代理创建一个与该接口兼容的对象,该对象在调用接口方法时,可以执行一些额外的操作。 1. Java动态代理机制: - 首先,我们需要定义一个接口,这是所有代理对象...
JDK动态代理的优点是它完全符合Java语言规范,不需要依赖额外的库,但缺点是只能对实现了接口的类进行代理,无法处理未实现接口的类。 **CGLib动态代理**: CGLib(Code Generation Library)是一个高性能的代码...
- **JDK代理**:JDK动态代理使用反射和InvocationHandler接口生成一个实现了目标接口的新类。在运行时,这个新类的实例作为代理对象,它的方法调用都会转发到InvocationHandler的`invoke()`方法。 - **CGLIB代理**...
CGLIB 动态代理使用 ASM 字节码工具来生成代理类。CGLIB 动态代理可以代理没有接口的类,這是因为 CGLIB 动态代理可以生成一个原类的子类,然后 override 原类的方法来实现代理。 在 Spring AOP 框架中,默认情况下...
CGlib则是Java动态代理的一种实现方式,尤其是在不提供接口的情况下,它通过生成目标类的子类来实现动态代理。 在Java中,JDK自带的动态代理机制是基于接口的,如果被代理的类没有实现任何接口,那么就无法使用JDK...
Java中的动态代理是一种重要的设计模式...总结来说,JDK动态代理和CGLIB动态代理都是为了在运行时提供对目标对象的增强,它们通过不同的实现方式提供了扩展功能的可能性,开发者可以根据项目需求和场景选择合适的技术。
CGLIB使用ASM库在运行时动态生成字节码,创建目标类的子类,从而实现对目标类方法的增强。 1. **Enhancer类** - `Enhancer`是CGLIB的主要入口,它扮演了工厂的角色,通过它可以配置代理对象的行为,并生成代理子类...
总结,CGLib动态代理在基于Maven的项目中有着广泛的应用,它提供了对未实现接口的类进行扩展的能力。通过理解其工作原理和使用方式,开发者可以更灵活地实现诸如日志记录、性能监控、事务管理等增强功能。结合实际...
在Java编程领域,AOP...CGLIB作为Java中的一种动态代理实现,提供了对无接口类的代理能力,是Java AOP框架如Spring的重要组成部分。理解并熟练运用这些知识点,能帮助开发者编写出更加灵活、高效和易于维护的代码。
CGLIB是一个基于ASM的字节码生成库,它允许我们在运行时对字节码进行修改和动态生成。cglib通过继承方式实现代理,也就是基于类,在子类中采用方法拦截的技术拦截所有父类方法的调用并顺势织入横切逻辑。 我们最终是...
CGlib是Java动态代理的一种实现方式,它不是依赖于Java的反射机制,而是通过生成目标类的子类来实现代理,因此在性能上通常优于基于接口的JDK动态代理。 CGlib动态代理的核心类包括`Enhancer`、`Callback`和`...
相比于JDK动态代理,CGLIB可以在没有接口的情况下进行代理,因此对于未实现接口的类,CGLIB是更好的选择。CGLIB使用ASM库来生成和加载代理类的字节码。 使用CGLIB代理通常需要引入cglib库,然后通过`...
CGlib在Spring AOP、Hibernate等流行框架中也有广泛的应用,例如Spring AOP在没有接口的情况下默认使用CGlib来实现对类的代理,以便进行切面编程。 总的来说,CGlib是一个强大的工具,可以让我们在运行时动态生成和...
总结来说,"cglib实现动态代理依赖jar包"中的asm-5.1.jar和cglib-3.2.4.jar是实现Java动态代理的重要工具,它们通过字节码技术实现了对类的无侵入式扩展和控制,是很多Java企业级框架的核心组成部分。
2. **无需接口**:CGLib可以对没有实现接口的类进行代理,这是Java动态代理(JDK Proxy)无法做到的。 3. **广泛支持**:许多知名框架如Spring AOP、Hibernate等都使用了CGLib作为底层的动态代理技术。 ### 应用...
3. **字节码生成**:CGLIB使用ASM库(一个Java字节码操控和分析框架)来生成和修改类的字节码,从而实现对目标类的动态代理。 **比较与选择** JDK动态代理简单易用,但仅限于代理实现接口的类。如果需要代理的类...