乐趣区

关于设计模式:经典设计模式之动态代理

为什么要学习设计模式?

设计模式在很多源码框架中广泛应用,如果不理解设计模式,间接看源码必定一头雾水。那我不看源码行不行?行,除非你有其余更好的倒退方向或者始终做一个高级。不然源码是绕不过来的,你不理解它,它对你来说就是一个黑盒子。

怎么学习设计模式?

网上学习教程很多,大多数讲一些 demo。我在学习的过程中,甚至有的把很简略的货色讲得超级简单。个别是简略类图 +demo+ 源码 + 理论场景中的利用联合来学习。尽可能找到走心的老师。

什么是动静代理?

mybatis 谁都会用, 然而为啥一个定义一个接口,没有实例能够间接调用?起因是 java 外部主动生成了一个实例。

怎么写?

咱们先找到 java.lang.reflect 包下的 Proxy 对象,调用它的 newProxyInstance 办法;
点进去看到,须要三个参数,别离是类加载器,类数组,以及 Invocation 接口;
vm 参数-Dsun.misc.ProxyGenerator.saveGeneratedFiles=true

package disign.pattern;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 动静代理
 */
public class DynamicProxy {
    interface DynamicProxyInterface {void sayHello();
    }

    public static void main(String[] args) {ClassLoader loader = DynamicProxy.class.getClassLoader();
        Class<?>[] interfaces = new Class[]{DynamicProxyInterface.class};
        DynamicProxyInterface dynamicProxyInterface = (DynamicProxyInterface) Proxy.newProxyInstance(loader, interfaces, new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("sayHello");
                return null;
            }
        });
        dynamicProxyInterface.sayHello();}
}


这图一放调用链路是不是很清晰,$Proxy0 外部保护了 InvocationHandler 接口,最终调用还是匿名外部类实现的办法;
从栈帧的角度看也是一样一样的;

退出移动版