`

CGLib动态代理实现

阅读更多
在以前学习JDK的动态代理时,了解到JDK动态代理是必须基于接口实现的,没有接口的话就不能使用JDK的动态代理,为代码添加新的应用逻辑。为了解决这个问题,可以使用CGLib动态代理。
下面就用CGLib动态代理实现一个简单的例子。在开始之前需要导入CGLib的jar包,这个jar包在Spring中可以找到,我导入的是cglib-nodep-2.1.3.jar。
一,首先,定义一个Person类:
package com.lyg.proxy;

public class Person {

	public void print(){
		System.out.println("Person's print method!");
	}
}

二,定义一个代理类

package com.lyg.proxy;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import net.sf.cglib.proxy.NoOp;

public class PersonCglib implements MethodInterceptor{

	private Object object;
	
	public Object getInstance(Object object){
		this.object = object;
		Enhancer enhancer  = new Enhancer();
		
		enhancer.setSuperclass(this.object.getClass());
		//设置回调方法
		enhancer.setCallback(this);
		//enhancer.setCallbacks(new Callback[]{this,NoOp.INSTANCE});
		//返回创建的代理对象
		return enhancer.create();
	}
	@Override
	public Object intercept(Object object, Method method, Object[] args,
			MethodProxy proxy) throws Throwable {
		// TODO Auto-generated method stub
		//加入方法处理前逻辑
		System.out.println("----Before print------");
		proxy.invokeSuper(object, args);
		//加入方法处理后逻辑
		System.out.println("----After print-------");
		return null;
	}

}

三 定义一个测试类
package com.lyg.proxy;

public class TestPersonCglib {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
        PersonCglib pc = new PersonCglib();
        Person person = (Person) pc.getInstance(new Person());
        person.print();
	}

}

四 输出结果
----Before print------
Person's print method!
----After print-------
可以看到在执行Person类中的print方法前后,加入了新的逻辑,实现了一个简单的动态代理。
分享到:
评论

相关推荐

    jdk与cglib动态代理与底层实现

    JDK和CGLIB是Java中实现动态代理的两种主要方式,它们在Spring框架中扮演着关键角色,尤其是在AOP(面向切面编程)中。 1. **JDK动态代理**: JDK动态代理基于Java的接口机制实现,因此,要使用JDK动态代理,被...

    CGlib实现动态代理(承接上面JDK实现动态代理)

    以下是使用CGlib实现动态代理的关键步骤: 1. 引入依赖:在项目中,需要引入CGlib的相关库,通常是在Maven或Gradle的配置文件中添加对应的依赖。 2. 创建Enhancer对象:Enhancer是CGlib的核心类,它提供了创建代理...

    基于MAVEN项目的CGLib动态代理原理及实现

    本文将深入探讨如何在基于Maven的项目中利用CGLib库实现动态代理。CGLib(Code Generation Library)是Java中一个高性能的代码生成库,它在运行期通过字节码技术为类创建子类,以此实现动态代理。 1. Maven项目配置...

    Jdk动态代理和cglib动态代理原理

    - **CGLIB代理**适用于目标类没有接口或者不希望修改原有接口的情况,其性能通常优于JDK代理,因为它是基于字节码生成的子类,而JDK代理需要反射调用接口方法。 在实际开发中,如Spring AOP框架就同时支持JDK和...

    JDK动态代理和Cglib动态代理实例源码

    2. **Cglib动态代理实现过程**: - 引入Cglib库,如cglib-nodep-3.3.0.jar。 - 创建一个实现了`MethodInterceptor`接口的类,重写`intercept`方法,这个方法会在调用目标方法前被调用。 - 使用`Enhancer`类创建...

    Spring框架中JDK动态代理和cglib动态代理

    CGLIB 动态代理可以代理没有接口的类,這是因为 CGLIB 动态代理可以生成一个原类的子类,然后 override 原类的方法来实现代理。 在 Spring AOP 框架中,默认情况下,Spring 会选择使用 JDK 动态代理,但是如果目标...

    AOP之JDK动态代理和CGLib动态代理

    Spring框架是AOP实现的一个典范,它提供了两种主要的动态代理方式:JDK动态代理和CGLib动态代理。 **JDK动态代理**: JDK动态代理基于Java的反射API实现,适用于接口代理。当目标对象实现了至少一个接口时,Spring...

    cglib动态代理介绍

    了解CGlib的工作原理和使用方式,有助于我们在实际开发中更好地利用动态代理实现复杂的功能,提高代码的灵活性和可维护性。在阅读源码时,我们可以深入理解CGlib如何生成子类以及如何进行方法拦截,这对于提升我们的...

    浅谈JDK动态代理与CGLIB代理去区别

    相反,CGLIB(Code Generation Library)是一种字节码生成库,它可以创建一个目标类的子类并覆盖其方法,以此实现动态代理。CGLIB使用ASM库来操作字节码,因此它不需要目标类实现任何接口,这使得它能应用于没有接口...

    Jdk动态代理,cglib动态代理,反射和拦截器(链)示例

    CGLIB通过生成子类并在子类的方法上织入增强代码来实现动态代理。相较于JDK动态代理,CGLIB在性能上有时会更优,特别是在处理未实现接口的类时。 反射是Java中另一种强大的工具,它允许程序在运行时检查和操作类、...

    cglib动态代理jar包

    1. `cglib-nodep-2.1_3.jar`:这是CGlib的主要库,包含了实现动态代理所需的所有类和方法,不依赖于其他外部库,如ASM。 2. `asm-2.2.3.jar`:ASM是一个Java字节码操控和分析框架,用于生成和修改类的字节码。CGlib...

    转载:cglib动态代理介绍(一)

    - 如果目标类中包含静态方法,CGlib代理不会影响静态方法的行为。 总结,CGlib是一个强大且灵活的工具,它通过字节码生成技术实现了对Java类的动态代理,尤其在没有接口约束或者性能要求高的情况下,它是Java开发者...

    JAVA动态代理实现Demo(JDK动态代理和CGLIB动态代理)

    Java提供了两种主要的动态代理实现方式:JDK动态代理和CGLIB动态代理。 **JDK动态代理**: JDK动态代理基于接口实现,也就是说,被代理的对象必须实现至少一个接口。代理机制的核心是`java.lang.reflect.Proxy`类和...

    Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理)

    Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理) Java 动态代理是 Java 编程语言中的一种强大工具,广泛应用于 Spring AOP、Hibernate 数据查询、测试框架的后端 mock、RPC 远程调用、Java 注解...

    CGlib动态代理类的jar包

    这个库广泛应用于许多框架和工具中,如Spring AOP、Hibernate等,主要用于实现动态代理、类增强等功能。CGlib通过ASM库来操作和生成字节码,提供对Java类的底层访问。 在Java编程中,动态代理是一种在运行时创建...

    静态代理、jdk动态代理、cglib动态代理

    Cglib 动态代理的实现方式是:我们首先需要定义一个类,然后使用 Cglib 库来生成该类的代理对象,该代理对象将拦截对被代理对象的所有方法调用,并控制对被代理对象的访问。 Cglib 动态代理的优点是:它的实现方式...

    CgLib动态代理所需的jar

    而CgLib则通过生成目标类的子类来实现动态代理,即使目标类没有接口,也可以进行代理。这使得CgLib在AOP(面向切面编程)框架如Spring AOP中发挥了重要作用,可以在方法调用前后插入拦截器代码,实现如性能监控、...

    cglib动态代理相关包

    CGlib动态代理基于ASM库来操作Java字节码,当目标对象没有实现接口时,CGlib可以创建目标对象的子类,并在子类中拦截方法调用。它通过生成的子类重写父类的方法,在被重写的方法内部添加额外的处理逻辑,如日志记录...

    CGLIB动态代理+CGLIB动态代理完整代码

    我们最终是通过一个代理对象去调用方法的,那我们就要获取一个代理对象,cglib代理,是通过Enhancer这个类里面对应的一个create()方法,去生成一个代理对象的。 Enhancer创建一个被代理对象的子类并且拦截所有的方法...

    cglib动态代理用到的两个包

    CGLib通过ASM解析类的字节码,然后在原有字节码的基础上插入新的字节码以实现动态增强。ASM的使用使得CGLib能够在运行时高效地创建和修改类,而无需重新编译源代码。 CGLib动态代理的使用步骤通常包括以下几点: - ...

Global site tag (gtag.js) - Google Analytics