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

2007年11月5日

看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 中的动态代理好用 ,那还要接口  不太方便 。

posted @ 2007-11-05 10:22 G_G 阅读(1574) | 评论 (2)编辑 收藏