`
azure2a
  • 浏览: 31984 次
  • 性别: 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子类代理

    Cglib代理,也叫做子类代理。在内存中构建一个子类对象从而实现对目标对象功能的扩展。如果想代理没有实现接口的类,就可以使用CGLIB实现。这是一个简单的案例。

    cglib aop spring 动态代理

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

    CGLIB动态代理jar包

    JDK动态代理必须提供接口才能使用,在一些不能提供接口的环境中,只能采用其他第三方技术,比如CGLIB动态代理,这里提供CGLIB动态代理的相关jar包,供学习和测试使用。

    cglib创建代理类.rar

    springAOP等框架中,大量用到代理技术; 两类代理技术: 1,java动态代理,见JDK文档或相关java书;...2.cglib创建代理类,比第一种更加简单,代理类和背代理类不需要实现共同接口。本例子就是cglib代理的例子,很简单

    cgLib与JDK动态代理的用法

    代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类...

    java设计模式【之】Cglib动态代理【源码】【场景:帮爸爸买菜】

    * 被代理类都不需要实现接口 * 代理类需要实现 MethodInterceptor(方法拦截器) * * 1.创建被代理类、创建代理类、代理类内部聚合被代理类 * 2.创建返回代理类实例方法 Enhancer.create(object.getClass(), ...

    cglib包及依赖汉cglib3.1和asm4.2

    cglib包及依赖汉cglib3.1和asm4.2,主要作用是用户代理,代理为控制要访问的目标对象提供了一种途径。当访问对象时,它引入了一个间接的层。...如果想代理没有实现接口的继承的类,该怎么办?现在我们可以使用CGLIB包

    cglib必须导入的包和案例

    JDK的动态代理有一个限制,就是使用动态代理的对象必须实现一个或多个接口,如果想代理没有实现接口的类,就可以使用Cglib实现. Cglib是一个强大的高性能的代码生成包,它可以在运行期扩展java类与实现java接口.它广泛的...

    cglib.jar下载

    通常可以使用Java的动态代理创建代理,但当要代理的类没有实现接口或者为了更好的性能,CGLIB是一个好的选择。 二、CGLIB原理 CGLIB原理:动态生成一个要代理类的子类,子类重写要代理的类的所有不是final的方法。...

    Java中的Cglib动态代理jar.7z

    Cglib动态代理技术对目标对象有没有实现接口,没有要求. Cglib动态代理技术,是通过拷贝然后修改目标对象的类的字节码来产生一个代理对象 而且这个Cglib产生的代理对象实例 是 目标对象的一个子类.

    cglib-3.2.0.jar

    最流行的OR Mapping工具hibernate也使用CGLIB来代理单端single-ended(多对一和一对一)关联(对集合的延迟抓取,是采用其他机制实现的)。EasyMock和jMock是通过使用模仿(mock)对象来测试java代码的包。它们都通过...

    cglib,关于代理的一个jar

    CGLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好...通常可以使用Java的动态代理创建代理,但当要代理的类没有实现接口或者为了更好的性能,CGLIB是一个好的选择。

    Spring框架+SpringAOP动态代理

    SpringAOP动态代理 ...CGLIB 代理:用于代理没有实现接口的类或final类。CGLIB(Code Generation Library)是一个代码生成的类库,可以在运行时动态生成一个目标类的子类,并覆盖其中的方法来实现代理。

    cglib 和asm jar包

    jdk动态代理是由Java内部的反射机制来实现的,cglib动态代理底层则是借助asm来实现的。总的来说,反射机制在生成类的过程中比较高效,而asm在生成类之后的相关执行过程中比较高效(可以通过将asm生成的类进行缓存,...

    spring_aop4.rar_Home Home_jar 转换_spring AOP jar

    2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP 3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换 如何强制使用CGLIB实现AOP? * 添加CGLIB库,SPRING_HOME/...

    cglib__jar包.zip

    cglib可以帮助java动态生成类,用动态代理需要实现接口,只用cglib不用asm会发生找不到类的异常,cglib在spring项目中也有使用

    代理模式所需的jar包—cglib.rar

    cglib动态代理 使用步骤: Step1:实现MethodInterceptor接口 Step2:创建方法对目标进行代理 Step3:重写intercept方法对代理目标方法进行拦截

    cglib的一系列jar包

    代理模式cglib所需要的jar包,代理模式的cglib不需要去实现接口即可完成,cglib代理也叫做动态代理

    你必须会的 JDK 动态代理和 CGLIB 动态代理

    静态代理就是在程序运行之前,代理类字节码.class就已编译好,通常一个静态代理类也只代理一个目标类,代理类和目标类都实现相同的接口。 接下来就先通过 demo 进行分析什么是静态代理,当前创建一个 Animal 接口,...

    Mybatis的Mapper方式整合elasticsearch的DSL调用,基于接口和代理生成bean注入的方式进行调用

    Mybatis的Mapper方式整合elasticsearch的DSL调用,之前的AOP进行了改进,使用cglib动态代理生成代理类,基于接口和代理生成bean注入的方式进行调用

Global site tag (gtag.js) - Google Analytics