写了一半。网页一黑。。东西就都没了。。。强烈建议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
换了个asm-all的包。。通过...
hellowork
public class HelloWord {
public void sayHello(){
System.out.println("helloWorld");
}
}
写一个代理类实现MethodIntercepter接口的intercept的方法,其中用proxy调用invokesuper的方法
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了。
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();
}
}
输出结果如下:
before
helloWorld
afert
引用一个博客,里面的例子也很好。特别是增加了methodfilter,是的cglib的功能更强大了
http://llying.iteye.com/blog/220452
总结一下,cglib封装了asm可以对类进行动态代理。主要是实现一个proxy实现了MethodIntercepter接口,然后客户端使用enhancer调用setsuperclass和setcallback,也可以用setcallbackfilter来过滤某些方法。