您的位置首页生活百科

CGLIB是什么

CGLIB是什么

的有关信息介绍如下:

CGLIB是什么

写了一半。网页一黑。。东西就都没了。。。强烈建议OSC的博客有个自动保存功能!!!! 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 helloworkpublic class HelloWord { public void sayHello(){ System.out.println(helloWorld);}}写一个代理类实现MethodIntercepter接口的intercept的方法,其中用proxy调用invokesuper的方法 public class CglibProxy implements MethodInterceptor{@Overridepublic 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了。 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();}}输出结果如下:beforehelloWorldafert引用一个博客,里面的例子也很好。特别是增加了methodfilter,是的cglib的功能更强大了 总结一下,cglib封装了asm可以对类进行动态代理。