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

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 传入方法对象与参数 最终进入拦截器进行方法调用。方法加强

上一篇:基于C#的内网穿透学习笔记(附源码)


下一篇:浅谈代理模式