Cglib实现动态代理

/**
 * Cglib生成代理类
 */
public class CglibMeiPo implements MethodInterceptor{

    
    /*
     *     生成代理类对象
     *     cglib动态生成代理类的原理是,
     *     1,通过继承生成父类的一个子类,然后这个子类会自己持有父类的引用,
     *     2,动态生成时需要把当前的this,传递给代理类,然后这个子类就可以回调下面的intercept方法,
     */

    public Object getInstace(Class<?> clz) {
        
        Enhancer enhancer = new Enhancer();
        
        //以被代理类为父类,动态生成它的子类
        enhancer.setSuperclass(clz);
        //把当前类设置为回调,然后下面的intercept方法就可以执行
        enhancer.setCallback(this);
        
        //动态生成代理类的字节码
        Object obj = enhancer.create();
        return obj;
    }
    
    
    /**
     * 动态生成的子类会回调这个方法
     */
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        System.out.println("被代理之前干一些事。。。");
        
//        System.out.println(methodProxy.getClass()+","+obj.getClass()+","+method.getClass());
        
        //obj class com.zl.test.Zhangsan$$EnhancerByCGLIB$$ea35018f的打印可以看出它是Zhangsan 父类的一个子类
//        这里一定要调用父类zhangsan的findLove 方法

        
        methodProxy.invokeSuper(obj, args);
        
        //这个会findLove 方法的递归死循环
//        methodProxy.invoke(obj, args);
        
        System.out.println("被代理之后干一些事。。。");
        
        return null;
    }

}

 

测试

public class Test {
    public static void main(String[] args) {
        //生成的代理类是zhangsan的子类,故可以被父类zhangsan接收
        Zhangsan zs = (Zhangsan)new CglibMeiPo().getInstace(Zhangsan.class);
        
        zs.findLove();
        
        //Cglib动态代理的优势是不需要写接口,可以少写一个类,
    }
}


测试结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值