打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
CGLIB是什么
CGLIB是一个反射的包,和JDK的反射不同,cglib反射的对象可以不用实现接口。cglib是就ASM的,引用一个图,很清晰。

spring的AOP的实现一种是使用原生的jdk的反射,一种就是使用cglib

引用一下:

CGlib是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。

 不多说了,直接上helloword的例子。

使用的时候报了如下错误:

Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type

忘引入asm的包了,引入,报如下错误:

java.lang.VerifyError: class net.sf.cglib.core.DebuggingClassWriter overrides final method visit.(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V

换了个asm-all的包。。通过...

hellowork

1
2
3
4
5
public class HelloWord {
    public void sayHello(){
        System.out.println("helloWorld");
    }
}

写一个代理类实现MethodIntercepter接口的intercept的方法,其中用proxy调用invokesuper的方法

1
2
3
4
5
6
7
8
9
10
11
public class CglibProxy implements MethodInterceptor{
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("before");
        proxy.invokeSuper(obj, args);
        System.out.println("afert");
        return null;
    }
     
}

接下来就是调用方法了,启用enhancer调用setsuperclass为要代理的类,setcallback为调用的代理类,然后用enhancer调用create重新生成一个要代理的类就ok了。
1
2
3
4
5
6
7
8
9
10
11
public class TestCglib {
    public static void main(String[] args) {
        //HelloWord helloWord=new HelloWord();
        //helloWord.sayHello();
        Enhancer enhancer=new Enhancer();
        enhancer.setSuperclass(HelloWord.class);
        enhancer.setCallback(new CglibProxy());
        HelloWord helloWord=(HelloWord) enhancer.create();
        helloWord.sayHello();
    }
}

输出结果如下:
1
2
3
before
helloWorld
afert

引用一个博客,里面的例子也很好。特别是增加了methodfilter,是的cglib的功能更强大了

http://llying.iteye.com/blog/220452

总结一下,cglib封装了asm可以对类进行动态代理。主要是实现一个proxy实现了MethodIntercepter接口,然后客户端使用enhancer调用setsuperclass和setcallback,也可以用setcallbackfilter来过滤某些方法。

 


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
java设计模式基础--动态代理
Java 常见内存溢出异常与代码实现
学习Scala:伴生对象的实现原理
字符串
[Ljava.lang.String和java.lang.String区别
CGLIB简介
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服