CGLIB被Spring AOP做为底层的一种实现。采用asm,动态生成字节码,比jdk proxy效率高,hibernate使用cglib动态生成DO/PO (接口层对象)字节码.
cglib依赖包
asm
http://forge.ow2.org/projects/asm/
cglibhttp://cglib.sourceforge.net/


CglibProxy.java
package com.java.demo.mode.proxy.cglib;

import java.lang.reflect.Method;

import com.java.demo.mode.builder.Builder;
import com.java.demo.mode.builder.IMadeRobot;
import com.java.demo.mode.builder.MadeRobot;

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class CglibProxy  implements MethodInterceptor {

    @Override
    
public Object intercept(Object obj, Method method, Object[] args,
            MethodProxy proxy) 
throws Throwable {
        doBefore();
        Object ob
=proxy.invokeSuper(obj, args);
        doAfter();
        
return ob;
    }
    
    
private void doBefore() {
        System.out.println(
"开始制造机器人.");
        IMadeRobot imr
=new MadeRobot();
        Builder builder
=new Builder(imr);
        builder.build();
        imr.finish();
    }

    
private void doAfter() {
        System.out.println(
"完成机器人制造.\n");
    }

}

RobotFactory.java
package com.java.demo.mode.proxy.cglib;

import com.java.demo.data.Product;

public class RobotFactory{
    
    
public Product getRobot(String className){
        Product robot
=null;
        
try {
            robot
=(Product)(Class.forName(className).newInstance());
        } 
catch (ClassNotFoundException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        } 
catch (InstantiationException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        } 
catch (IllegalAccessException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        
return robot;
    }

}

CglibFilter.java
package com.java.demo.mode.proxy.cglib;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.CallbackFilter;

public class CglibFilter implements CallbackFilter {
    
    
private final static int YES=1;//不执行代理
    private final static int NO=0;//执行代理

    @Override
    
public int accept(Method arg0) {
        
// TODO Auto-generated method stub
        
//对所调用的方法名进行过滤
        return YES;
    }

}


Demo.java
package com.java.demo.mode.proxy.cglib;

import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.NoOp;

import com.java.demo.data.Product;

public class Demo {

    
/**
     * 
@param args
     
*/
    
public static void main(String[] args) {
        
//cglib中的NoOp.INSTANCE就是一个空的拦截器
        
//setCallbacks中的拦截器(interceptor)的顺序,一定要和CallbackFilter里面指定的顺序一致!!切忌。
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(RobotFactory.
class);
        enhancer.setCallbacks(
new Callback[]{new CglibProxy(), NoOp.INSTANCE});
        enhancer.setCallbackFilter(
new CglibFilter());
        RobotFactory factory
=(RobotFactory) enhancer.create();
        Product robot 
=factory.getRobot("com.java.demo.data.robot.RobotA");
        robot.desc();

    }

}




posted on 2010-09-29 10:55 岁月神偷 阅读(433) 评论(0)  编辑  收藏 所属分类: J2EE

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


网站导航: