`

基于Cglib的动态代理

阅读更多

由于JDK只能基于接口进行动态代理,所以Spring使用JDK和Cglib结合使用来产生动态代理,Cglib可以进行类的动态代理

 

下面就是一个简单的动态代理例子:

被代理的类

package com.lbx.dog;


public class Dog {

	public void info() {
		// TODO Auto-generated method stub
		System.out.println("这是一只狗");
	}

	public void run() {
		// TODO Auto-generated method stub
		System.out.println("这只狗在RUN");
	}

}

 

 

类似与拦截器的拦截方法

package com.lbx.proxy;

public class DogInterceptor {

	public void method1(){
		System.out.println("第一个拦截方法");
	}
	
	public void method2(){
		System.out.println("第二个拦截方法");
	}
	
}

 

 

 

代理对象的实现

package com.lbx.proxy;

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 CglibProxy implements MethodInterceptor {

	private Enhancer enhancer = new Enhancer();
	DogInterceptor di = new DogInterceptor();
	
	public CglibProxy(){
	}
	
	public Object getProxy(Class c){
		enhancer.setSuperclass(c);
		enhancer.setCallback(this);
		return enhancer.create();
	}
	
	public Object intercept(Object obj, Method method, Object[] args,
			MethodProxy proxy) throws Throwable {
		di.method1();
		Object result = proxy.invokeSuper(obj, args);
		di.method2();
		return result;
	}

}

 

 

测试程序

package com.lbx.test;

import com.lbx.dog.Dog;
import com.lbx.proxy.CglibProxy;


public class Test {

	public static void main(String[] args) {
		
		CglibProxy proxy = new CglibProxy();
		Dog proxyDog = (Dog)proxy.getProxy(Dog.class);
		proxyDog.info();
		proxyDog.run();
		
	}
	
}

 

分享到:
评论

相关推荐

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

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

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

    CGLIB 动态代理是基于类的代理, 它可以代理类和接口。CGLIB 动态代理使用 ASM 字节码工具来生成代理类。CGLIB 动态代理可以代理没有接口的类,這是因为 CGLIB 动态代理可以生成一个原类的子类,然后 override 原类...

    cglib动态代理介绍

    在Java中,JDK自带的动态代理机制是基于接口的,如果被代理的类没有实现任何接口,那么就无法使用JDK的动态代理。而CGlib则弥补了这一不足,它通过字节码技术生成目标类的子类,然后在子类中拦截父类方法的调用,...

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

    JDK动态代理基于Java的反射API实现,适用于接口代理。当目标对象实现了至少一个接口时,Spring会创建一个代理对象,这个代理对象实现了与目标对象相同的接口,并在调用接口方法时插入额外的切面逻辑。代理对象在运行...

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

    在Java开发中,动态代理和CGLIB代理是两种常见的面向切面编程(AOP)实现方式,它们都用于在不修改原有代码的情况下,增强或扩展对象的功能。本篇文章将深入探讨JDK动态代理和CGLIB代理的区别,以及它们在实际应用中...

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

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

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

    - **CGLIB代理**:CGLIB通过ASM生成一个继承自目标类的新类,这个新类覆盖了目标类的所有方法,并在这些方法内部调用拦截器链。在运行时,这个新类的实例作为代理对象。 5. **优缺点**: - JDK代理简单易用,但...

    cglib动态代理jar包

    CGlib动态代理是Java开发中一个非常重要的工具库,它主要用来实现代理模式,尤其在面向切面编程(AOP)中发挥着关键作用。CGlib是一个强大的高性能的代码生成库,它可以在运行期扩展Java类与实现Java接口。CGlib并不...

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

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

    CGlib动态代理类的jar包

    CGlib是Java动态代理的一种实现方式,它不是依赖于Java的反射机制,而是通过生成目标类的子类来实现代理,因此在性能上通常优于基于接口的JDK动态代理。 CGlib动态代理的核心类包括`Enhancer`、`Callback`和`...

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

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

    CgLib动态代理所需的jar

    当目标类没有实现接口时,Java的标准动态代理机制JDK Proxy就无法工作,因为JDK Proxy是基于接口的。而CgLib则通过生成目标类的子类来实现动态代理,即使目标类没有接口,也可以进行代理。这使得CgLib在AOP(面向切...

    cglib动态代理相关包

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

    cglib动态代理

    ### cglib动态代理详解 ...通过上述步骤,我们成功地实现了基于cglib的动态代理,有效地控制了只有特定用户才能执行特定操作的需求。这种方法不仅减少了代码重复,还提高了系统的灵活性和可维护性。

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

    CGlib是Java编程语言中的一个库,主要用于生成子类,以此实现对现有类的动态代理。它是基于ASM库,能够直接操作字节码,从而在运行时创建新类的实例。在Java中,CGlib是一个非常重要的工具,特别是在AOP(面向切面...

    代理模式-静态动态代理-jdk动态代理-cglib动态代理

    CGLIB(Code Generation Library)是另一个动态代理库,它基于字节码技术,可以为任何类创建代理,而不仅仅是实现了接口的类。CGLIB使用ASM库生成代理类的字节码并加载到内存中。当原始类没有接口时,CGLIB比JDK动态...

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

    Cglib是一个第三方库,它基于ASM库动态生成子类,实现对目标类的代理。相比JDK动态代理,Cglib不需要目标类实现接口,因此适用于无法修改源码或不希望实现接口的情况。 2. **Cglib动态代理实现过程**: - 引入...

    输出JDK和CGLib动态代理产生的class文件.zip

    2. CGLib代理项目: - src/main/java:包含目标类 - target/classes:编译后的class文件,包括目标类的class文件,以及由CGLib生成的子类class文件 - 测试代码:展示如何使用Enhancer创建代理对象并调用方法 这...

    CGlib动态代理的好例子!

    CGlib,全称为Code Generation Library,是Java编程语言中的一个代码生成库,广泛应用于动态代理、性能监控以及AOP(面向切面编程)等领域。它是一个强大的、高性能的代码生成库,可以在运行期扩展Java类与实现Java...

    jdk动态代理和CGlib动态代理

    JDK动态代理基于Java的接口实现。如果一个类实现了至少一个接口,我们就可以为这个类创建一个动态代理。动态代理通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。以下是一些...

Global site tag (gtag.js) - Google Analytics