CGLib 学习

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

你可能感兴趣的:(CGLib 学习)