JAVA代理

静态代理

接口:A 类:B实现了A 代理类:有个A属性,实现A接口

interface A{
    func();
}

class B implements A{
    func(){}
}

class Proxy implements A{
    A a=new B; //被代理的类
    func(){
        //被织入的内容
        xxxx
        a.func();
        //被织入的内容
        xxxx
    }
}

jdk动态代理

必须实现接口

/*
第一步:创建接口,JDK动态代理基于接口实现,所以接口必不可少(准备工作)
第二步:实现InvocationHandler接口,重写invoke方法(准备工作)
第三步:调用Proxy的静态方法newProxyInstance方法生成代理实例(生成实例时需要提供类加载器,我们可以使用接口类的加载器即可)
第四步:使用新生成的代理实例调用某个方法实现功能。
*/
class AProxy implements InvocationHandler{
    Object targeObj; //被代理的对象(必须实现接口,即不能为普通类)
    public AProxy(Object obj){
        this.targeObj=obj;
    }
    @Overide
    public Object invoke(Object obj,Method method,Object[] args){
        //被织入的内容
        xxxxx
        Object result = method.invoke(this.targetObje,args);
        //被织入的内容
        xxxxx
        return result;
    }
}

main(){
    A a = new B();
    InvocationHandler ih = new AProxy(a);
    A proxy = Proxy.newProxyInstance(A.getClass().getClassLoader(),
        A.getInterfaces(),ih);
    proxy.add(1,2);
}
class AProxy implements InvocationHandler{
    Object targeObj; //被代理的对象(必须实现接口)
    public Object getProxyObj(Object obj){
        this.targeObj=obj;
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(),
            obj.getClass().getInterfaces().this);
    }
    @Overide
    public Object invoke(Object obj,Method method,Object[] args){
        //被织入的内容
        xxxxx
        Object result = method.invoke(this.targetObje,args);
        //被织入的内容
        xxxxx
        return result;
    }
}

main(){
    A a = (A)new AProxy.getProxyObj(new B());
    a.func();
}

cglib动态代理

类似于代理类继承目标类,重写方法

class CglibProxy implements MethodInteceptor{
    Object targetObj;
    public Object getProxyInstance(Object obj){
        this.targetObj = obj;
        Enhancer eh =new  Enhancer();
        //将目标对象设置为父类
        eh.setSuperclass(obj);
        //设置回调
        eh.setCallback(this);
        //创建子类
        return eh.create();
    }
    @Override
    public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        //织入
        xxxxx
        Object result = method.invoke(this.targetObj,args);
        xxxx
        return result;
    }
}
//普通类 不需要实现接口
class User{
    public void printfName(){
        xxxxx
    }
}
main(){
    User user = (User) new CglibProxy().getProxyInstance(new User());
    user.printfName();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值