`
azure2a
  • 浏览: 32838 次
  • 性别: Icon_minigender_1
  • 来自: 承德
社区版块
存档分类
最新评论

cglib实现无接口代理

阅读更多

  使用情况:有时候我们需要为一个类建立代理对象,当执行原类的某种方法时,进行某些操作,但是这要求我们原来的类实现某种接口。如果原来的类没有实现任何的接口怎么实现代理哪?现在我们可以利用Cglib为任何的类产生代理对象,不管原来的类有没有实现接口,甚至我们可以使代理对象动态的实现任意接口。
  例子
     1、产生带拦截器的代理对象。
     2、产生带拦截器和继承接口的代理对象。
     3、产生带拦截器和拦截器过滤器的代理对象。

  包里的内容

     案例,依赖包。

 

分享到:
评论
7 楼 bryande 2011-02-16  
建议看看Spring拦截器的实现,就是用cglib和java中的proxy类
6 楼 zuiyanwangyue 2011-02-16  
azure2a 写道
zuiyanwangyue 写道
System.out.println(proxyObjWithInterfaceAndCallBack instanceof TestInterface);可以打印出true

但是System.out.println(((TestInterface)proxyObjWithInterfaceAndCallBack).getIntValue());却会报错

Exception in thread "main" java.lang.NoSuchMethodError: com.muzi.util.reflect.CglibTest.getIntValue()I
at com.muzi.util.reflect.CglibTest$$EnhancerByCGLIB$$ddc15b7a.CGLIB$getIntValue$7(<generated>)
at com.muzi.util.reflect.CglibTest$$EnhancerByCGLIB$$ddc15b7a$$FastClassByCGLIB$$d4e392b.invoke(<generated>)
at net.sf.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:215)
at com.muzi.util.reflect.MethodInterceptorImpl1.intercept(MethodInterceptorImpl1.java:21)
at com.muzi.util.reflect.CglibTest$$EnhancerByCGLIB$$ddc15b7a.getIntValue(<generated>)
at com.muzi.util.reflect.CglibTest.main(CglibTest.java:34)

因为CglibTest类并没有getIntValue方法所以会报错,所以还要自CglibTest类中加入getIntValue方法,比如
public int getIntValue(){
return 1;
}。


我觉得CGLIB的真正威力就是动态代理吧,即使原来的对象不具备某接口中的方法也是可以的,因为CGLIB可以在运行时修改类的定义,个人觉得还是你这个例子做的不是很到位。
5 楼 azure2a 2011-02-16  
pouyang 写道
,不错
		CglibTest proxyObjWithInterfaceAndCallBack=(CglibTest)CglibProxy.getProxyInstance(CglibTest.class,new Class[]{TestInterface.class},new MethodInterceptorImpl1());
		//带拦截器和接口的代理对象。


CglibTest 应该实现 TestInterface 接口吧,不然的话,proxyObjWithInterfaceAndCallBack 调用接口的方法怎么调?

  不需要实现TestInterface,只需要含有接口中方法就行,当然不含有的话也不会报错,只有调用时才报错。
4 楼 pouyang 2011-02-16  
,不错
		CglibTest proxyObjWithInterfaceAndCallBack=(CglibTest)CglibProxy.getProxyInstance(CglibTest.class,new Class[]{TestInterface.class},new MethodInterceptorImpl1());
		//带拦截器和接口的代理对象。


CglibTest 应该实现 TestInterface 接口吧,不然的话,proxyObjWithInterfaceAndCallBack 调用接口的方法怎么调?
3 楼 kakaluyi 2011-02-16  
Cglib and dynamically proxy are the implementation of Spring IOC.I think proxy patten is a good design in some situation.
2 楼 azure2a 2011-02-16  
zuiyanwangyue 写道
System.out.println(proxyObjWithInterfaceAndCallBack instanceof TestInterface);可以打印出true

但是System.out.println(((TestInterface)proxyObjWithInterfaceAndCallBack).getIntValue());却会报错

Exception in thread "main" java.lang.NoSuchMethodError: com.muzi.util.reflect.CglibTest.getIntValue()I
at com.muzi.util.reflect.CglibTest$$EnhancerByCGLIB$$ddc15b7a.CGLIB$getIntValue$7(<generated>)
at com.muzi.util.reflect.CglibTest$$EnhancerByCGLIB$$ddc15b7a$$FastClassByCGLIB$$d4e392b.invoke(<generated>)
at net.sf.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:215)
at com.muzi.util.reflect.MethodInterceptorImpl1.intercept(MethodInterceptorImpl1.java:21)
at com.muzi.util.reflect.CglibTest$$EnhancerByCGLIB$$ddc15b7a.getIntValue(<generated>)
at com.muzi.util.reflect.CglibTest.main(CglibTest.java:34)

因为CglibTest类并没有getIntValue方法所以会报错,所以还要自CglibTest类中加入getIntValue方法,比如
public int getIntValue(){
return 1;
}。
1 楼 zuiyanwangyue 2011-02-16  
System.out.println(proxyObjWithInterfaceAndCallBack instanceof TestInterface);可以打印出true

但是System.out.println(((TestInterface)proxyObjWithInterfaceAndCallBack).getIntValue());却会报错

Exception in thread "main" java.lang.NoSuchMethodError: com.muzi.util.reflect.CglibTest.getIntValue()I
at com.muzi.util.reflect.CglibTest$$EnhancerByCGLIB$$ddc15b7a.CGLIB$getIntValue$7(<generated>)
at com.muzi.util.reflect.CglibTest$$EnhancerByCGLIB$$ddc15b7a$$FastClassByCGLIB$$d4e392b.invoke(<generated>)
at net.sf.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:215)
at com.muzi.util.reflect.MethodInterceptorImpl1.intercept(MethodInterceptorImpl1.java:21)
at com.muzi.util.reflect.CglibTest$$EnhancerByCGLIB$$ddc15b7a.getIntValue(<generated>)
at com.muzi.util.reflect.CglibTest.main(CglibTest.java:34)

相关推荐

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

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

    cglib实现动态代理依赖jar包

    总结来说,"cglib实现动态代理依赖jar包"中的asm-5.1.jar和cglib-3.2.4.jar是实现Java动态代理的重要工具,它们通过字节码技术实现了对类的无侵入式扩展和控制,是很多Java企业级框架的核心组成部分。

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

    这使得CGLIB能够代理没有实现接口的类。CGLIB的核心是ASM库,它能直接操作字节码生成新的类。在Spring中,如果目标类没有实现接口,Spring会自动选择CGLIB进行代理。 3. **Spring中的动态代理**: 在Spring中,AOP...

    java代理机制 JDK动态代理和cglib代理 详解

    - **CGLIB代理**:更适合未实现接口的类,更灵活,但生成代理类的速度较慢,因为涉及到字节码的生成。 总结: Java代理机制为我们提供了在运行时扩展功能的能力,无论是JDK动态代理还是CGLIB代理,都是为了在不修改...

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

    Spring AOP默认使用JDK动态代理,但如果目标类没有实现接口,它会自动切换到CGLIB。在"通过Configuration文件实现AOP.docx"文档中,可能会详细讲述如何在Spring配置文件中配置AOP代理,包括如何选择使用JDK动态代理...

    JDK代理和Cglib代理

    3. 性能:通常情况下,Cglib的性能优于JDK代理,因为生成子类比创建接口代理更快。 4. 灵活性:Cglib由于不依赖于接口,因此在对象模型设计上更自由。 5. 兼容性:JDK代理是Java标准库的一部分,而Cglib是第三方库,...

    Java动态代理详解; CGLib实现动态代理1

    Java 动态代理详解与 CGLib 实现 在 Java 中,代理模式是一种设计模式,它允许我们在不修改原有对象的基础上,为对象增加额外的功能。代理模式的核心在于代理类(Proxy)作为真实对象(RealSubject)的替代品,提供...

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

    在 Spring AOP 框架中,默认情况下,Spring 会选择使用 JDK 动态代理,但是如果目标对象没有实现接口,Spring 就会选择使用 CGLIB 动态代理。这种机制可以确保 Spring AOP 框架可以代理任何类型的对象,无论它是否...

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

    总结,CGLib动态代理在基于Maven的项目中有着广泛的应用,它提供了对未实现接口的类进行扩展的能力。通过理解其工作原理和使用方式,开发者可以更灵活地实现诸如日志记录、性能监控、事务管理等增强功能。结合实际...

    Java 动态代理和Cglib代理(二)

    首先,Java的动态代理基于Java的反射API实现,主要用于接口代理。当目标对象实现了至少一个接口时,我们可以使用`java.lang.reflect.Proxy`类来创建代理对象。这个代理对象会拦截调用并执行自定义逻辑。例如,在调用...

    简单实现Cglib子类代理

    在Spring框架中,当目标对象没有实现接口时,Spring会默认使用Cglib进行代理。 CGLIB全称为Code Generation Library,它能够生成Java字节码并将其编译为Class对象。Cglib通过继承机制来创建代理对象,因为不是所有...

    JDK和CGlib分别实现的动态代理源代码

    总结一下,JDK动态代理适用于目标对象实现了接口的情况,而CGlib则适用于未实现接口的类。两者在性能上,CGlib通常比JDK代理稍快,但创建代理的过程相对复杂。选择哪种代理方式取决于具体的需求和项目情况。了解并...

    CGLib代理模式用到的jar包

    CGLib代理主要分为两种类型:接口代理和类代理。对于实现了接口的类,CGLib可以像JDK的动态代理一样工作,但如果目标类没有实现任何接口,CGLib则可以通过生成目标类的子类来实现动态代理。CGLib的核心类包括...

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

    在实际开发中,如Spring AOP框架就同时支持JDK和CGLIB动态代理,根据目标类是否实现接口自动选择合适的代理方式。 总结来说,JDK动态代理和CGLIB动态代理都是为了在运行时提供对目标对象的增强,它们通过不同的实现...

    CGLIB 和 JDK生成动态代理类的区别

    因此,对于没有实现接口的类,CGLIB可以提供动态代理功能。 性能方面,CGLIB通常比JDK动态代理更快,因为它是基于字节码生成的子类,而JDK动态代理需要创建接口的实现类。但是,如果目标类已经实现了接口,JDK动态...

    JDK动态代理和CGLIB代理

    相比于JDK动态代理,CGLIB可以在没有接口的情况下进行代理,因此对于未实现接口的类,CGLIB是更好的选择。CGLIB使用ASM库来生成和加载代理类的字节码。 使用CGLIB代理通常需要引入cglib库,然后通过`...

    动态代理和cglib例子

    而CGLIB(Code Generation Library)则是一个强大的Java字节码操纵框架,常用于创建子类代理,当目标对象无法实现接口时,CGLIB就会派上用场。 一、动态代理 动态代理主要基于Java的反射API和InvocationHandler...

    cglib的动态代理需要的包

    这时,CGlib就派上用场了,它可以通过继承目标类来创建代理对象,即使目标类没有实现接口。 在使用CGlib时,我们需要引入CGlib的相关jar包,比如这里提到的`cglib-2.2.2.jar`。这个版本的CGlib包含了所有必要的类和...

    cglib aop spring 动态代理

    jdk动态代理--适合企业级开发,但是它要求必须面向接口编程,假如目标类没有实现接口,则没办法代理这个类。 cglib代理, 1.cglib(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库。它可以在...

    cglib代理jar包

    对于没有实现接口的类,我们就需要借助如CGlib这样的第三方库来实现动态代理。 CGlib代理的工作原理是基于ASM库来生成子类并动态加载到内存中,当调用方法时,实际上是调用了被代理对象的方法。CGlib代理的创建过程...

Global site tag (gtag.js) - Google Analytics