cglib动态代理

学了下java的代理技术,java本身提供的2种代理,只能对目标对象为实现某一接口的类进行代理,如果目标对象没有实现任何接口,可以使用cglib

public class CglibFactory implements MethodInterceptor{


    private Target target;
    
    public Target create(Target target){

        this.target = target;

       //cglib创建的代理对象,其实就是继承了被代理的目标对象,覆盖其中的所有非final方法,覆盖方法时会添加一些拦截代码

        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(this.target.getClass());
        enhancer.setCallback(this);
        return (Target)enhancer.create();
    }
    
    public Object intercept(Object arg0, Method method, Object[] args,
            MethodProxy methodProxy) throws Throwable {
        Object result = null;
        System.out.println("before call");
        try {
            result = methodProxy.invoke(target, args);
            System.out.println("after call");
        } catch (Exception e) {
            System.out.println("call exception");
            e.printStackTrace();
        } finally{
            System.out.println("finally after call");
        }
        return result;
    }

}


public class Target {
    public void m1(){
        System.out.println("this is method:m1");
    }
    
    public void m2(String str){
        System.out.println("this is method:m2,with parameter:"+str);
    }
}


public class Test {

    /**
     * @param args
     */
    public static void main(String[] args) {
        CglibFactory factory = new CglibFactory();
        Target target = factory.create(new Target());
        target.m2("m2");
    }

}


你可能感兴趣的:(java,exception,String,object,null,Class)