关于动态代理结合各种理解的个人理解

1.代理的本质就是在非入侵的一种方式下对被代理对象方法的增强
说白了 就是在原有方法的情况下再加 日志 等东西
2.动态代理的本质就是一个代理工厂(实现了InvocationHandler接口的实现类),通过set方法set target(被代理的对象) 然后通过反射自动生成代理对象,代理对象调用方法时都会统一被invoke(cglib是inceptor)拦截 在invoke中可进行增强操作,比如加日志,这大概就是动态代理的简要过程。

动态代理最中通要的两个重点 Proxy 与 invocathander

Invocationhander 接口有一个invoke方法 这是 所有代理类对象调用方法的入口,至于为什么是入口会面会解释
接口

public interface Start {
    String sing(String name);

    String dance(String name);
}

接口实现类

public class LIUDeHua implements Start{
    @Override
    public String sing(String name)
    {
        System.out.println("给我一杯忘情水");

        return "唱完" ;
    }

    @Override
    public String dance(String name)
    {
        System.out.println("开心的马骝");

        return "跳完" ;
    }

}

class ProxyFactory implements InvocationHandler
    //InvocationHandler实现类
{
    // 目标类,也就是被代理对象
    private Object target;

    public void setTarget(Object target)
    {
        //注入代理对象
        this.target = target;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
    {

        // 这里可以做增强
        System.out.println("随便加什么东西");
        //方法的正常调用
        Object result = method.invoke(target , args);
        System.out.println("随便加什么东西");

        return result;
    }

    // 生成代理类
    public Object CreatProxyedObj()
    {
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }
}

实现InvocationHandler接口的实现类可以当做一个代理工厂,通过set方法注入被代理对象,让后通过反射生成代理对象 。

为什么代理对象调用方法会自动调用invoke方法
return 的一个代理对象是一个Proxy的一个实例,这个实例实现了InvocationHandler接口,并且这个代理对象的Class类是 P r o x y 0 , 这 个 Proxy0,这个 Proxy0,Proxy0类继承了Proxy,实现了接口 Start

Proxy类中newProxyInstance 传入3个参数 根据参数loader和interfaces调用方法 getProxyClass(loader, interfaces)创建代理类$Proxy0. $Proxy0类 实现了interfaces的接口,并继承了Proxy类.
下面就是将 $Proxy0类实例化
$Proxy0类
在这里插入图片描述
顺便把h传给proxy
在这里插入图片描述
最终代理对象的实例方法
在这里插入图片描述
其实是 父类的调用 hander 的invoke 传入方法对象与参数 最终进入拦截器进行方法调用。方法加强

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值