代理模式之动态代理(cglib版本)

cglib动态代理的实现,原理
 
//被代理类 注意相对于jdk动态代理 cglib不需要一个公共接口-
package com.xyd.cglib;

public class CglibService {

    public  void  say(){
        System.out.println("我是被代理的方法 也叫做委托类");
    }
}

//实现cglib的接口MethodInterceptor

package com.xyd.cglib;

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

import java.lang.reflect.Method;

public class CglibProxy implements MethodInterceptor {

    Object o;

    public Object getInstance(Object targer){
        this.o = targer;
        //cglib的核心原理 不需要接口,而是继承委托类
        Enhancer enhancer = new Enhancer();
        //产生目标类的子类
        enhancer.setSuperclass(this.o.getClass());
        //设置回调方法是MethodInterceptor的实现类
        enhancer.setCallback(this);
        //实例化我们构建的子类
        return enhancer.create();
    }
    public Object intercept(Object obj, 
    		Method method, 
    		Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("访问控制系统 启动···");
        proxy.invokeSuper(obj,args);
        System.out.println("你可真能闹儿");
        return null;
    }
}


//调用代码
package com.xyd.cglib;

public class MainCglib {
    public static void main(String[] args) {
        CglibService cglibService = new CglibService();
        CglibProxy cglibProxy = new CglibProxy();
        CglibService cglibSay = 
        (CglibService)cglibProxy.getInstance(cglibService);
        cglibSay.say();
    }
}



cglib与jdk代理的区别
用cglib实现代理 被代理类的不需要有接口
原理上的区别就是
cglib是通过继承被代理类来实现的代理
jdk动态代理的原理是通过被代理类获取接口
通过接口在jdk内存中动态生成另一个这接口的实现类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值