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

CGLib 学习

Posted on 2007-11-05 10:22 G_G 阅读(1591) 评论(2)  编辑  收藏 所属分类: 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 中的动态代理好用 ,那还要接口  不太方便 。

Feedback

# 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星期才到理解程度 呵呵



标题  
姓名  
主页
验证码 *  
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-11-05 10:25 编辑过