posts - 165, comments - 198, trackbacks - 0, articles - 1
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

CGLib 学习

Posted on 2007-11-05 10:22 G_G 阅读(5777) 评论(3)  编辑  收藏 所属分类: AOP
看hbn 源代码 发现用了 CGlib 这就看看这个jar 。特留个文 ^_^(转)http://www.nirvanastudio.org/java/cglib-%E6%8C%87%E5%8D%97.html

CGlib 就2个例能说明一切 
先是使用类                                                                         
public class MyClass {
 
    
public void method() {
        System.out.println(
"MyClass.method()");
    }

    
public void method2() {
        System.out.println(
"MyClass.method2()");
    }
}

例1:
import java.lang.reflect.Method;
 
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodProxy;
import net.sf.cglib.proxy.MethodInterceptor;
 
public class Main {
 
    
public static void main(String[] args) {
 
        Enhancer enhancer 
= new Enhancer();
      
        //在这代理了
        enhancer.setSuperclass(MyClass.
class);
        enhancer.setCallback( 
new MethodInterceptorImpl() );
 
        // 创造 代理 (动态扩展了MyClass类)
        MyClass my 
= (MyClass)enhancer.create();
 
        my.method();
    }
 
    
private static class MethodInterceptorImpl implements MethodInterceptor {
        
        
public Object intercept(Object obj, 
                                Method method, 
                                Object[] args, 
                                MethodProxy proxy) 
throws Throwable {
 
            System.out.println(method);
 
            proxy.invokeSuper(obj, args);
 
            
return null;
        }
    }
}


例2:
import java.lang.reflect.Method;


import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodProxy;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.NoOp;
import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.CallbackFilter;
 
 
public class Main2 {
 
    
public static void main(String[] args) {
 
        Callback[] callbacks 
=
            
new Callback[] { new MethodInterceptorImpl(),  NoOp.INSTANCE };
 
        Enhancer enhancer 
= new Enhancer();
 
        enhancer.setSuperclass(MyClass.
class);
        enhancer.setCallbacks( callbacks );
        //添加 方法过滤器  返回1为不运行 2 为运行
        enhancer.setCallbackFilter( 
new CallbackFilterImpl() );
 
 
        MyClass my 
= (MyClass)enhancer.create();
 
        my.method();
        my.method2();
    }
 
    
private static class CallbackFilterImpl implements CallbackFilter {
 
        
public int accept(Method method) {
 
            
if ( method.getName().equals("method2") ) {
                
return 1;
 
            } 
else {
                
return 0;
            }
        }
    }
 
    
private static class MethodInterceptorImpl implements MethodInterceptor {
        
        
public Object intercept(Object obj, 
                                Method method, 
                                Object[] args, 
                                MethodProxy proxy) 
throws Throwable {
 
            System.out.println(method);
 
            
return proxy.invokeSuper(obj, args);
        }
    }
}


简单不 哈哈 比jdk 中的动态代理好用 ,那还要接口  不太方便 。

评论

# re: CGLib 学习  回复  更多评论   

2007-11-07 10:03 by 雨奏
@G_G
兄弟能否说说用CGLIB有哪些限制或副作用?

# re: CGLib 学习  回复  更多评论   

2007-11-09 17:11 by G_G
@雨奏
限制或副作用到没感觉到
但功能明显太单薄了
和aspectj没的比 切入表达式 的aspectj 和只可以硬编码的切CGlib
的功能用下就知道 CGlib 太简单了
但他好用,好上手,给5分钟就上了

aspectj 我花了2星期才到理解程度 呵呵

# re: CGLib 学习  回复  更多评论   

2009-01-16 17:07 by Hill
请问一下。你真的可以运行吗?我前几天做了一个和你这个差不多的。总报错。请指点一下啊。
net.sf.cglib.core.CodeGenerationException: java.lang.reflect.InvocationTargetException-->null
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:237)
at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:285)
at spring.AOPInstrument.getInstrumentedClass(AOPInstrument.java:28)
at spring.CGLibTest.main(CGLibTest.java:24)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at net.sf.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:384)
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:219)
... 4 more
Caused by: java.lang.SecurityException: class "spring.MessageWriter$$EnhancerByCGLIB$$29bc061d"'s signer information does not match signer information of other classes in the same package
at java.lang.ClassLoader.checkCerts(ClassLoader.java:611)
at java.lang.ClassLoader.defineClass(ClassLoader.java:532)
... 10 more
Exception in thread "main"

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问