为什么要学习设计模式?

设计模式在很多源码框架中广泛应用,如果不了解设计模式,直接看源码肯定一头雾水。那我不看源码行不行?行,除非你有其他更好的发展方向或者一直做一个初级。不然源码是绕不过去的,你不了解它,它对你来说就是一个黑盒子。

怎么学习设计模式?

网上学习教程很多,大多数讲一些demo。我在学习的过程中,甚至有的把很简单的东西讲得超级复杂。一般是简单类图+demo+源码+实际场景中的应用结合来学习。尽可能找到走心的老师。

什么是动态代理?

mybatis谁都会用,但是为啥一个定义一个接口,没有实例可以直接调用?原因是java内部自动生成了一个实例。

怎么写?

我们先找到java.lang.reflect包下的Proxy对象,调用它的newProxyInstance方法;image.png
点进去看到,需要三个参数,分别是类加载器,类数组,以及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();
    }
}

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


Nirvana
32 声望5 粉丝

整个体系复杂对我而言又陌生,每次学习对自己的脑力与知识体系都是一个巨大的挑战,也需要克服巨大的惰性;巨大的挑战同时也意味着巨大的诱惑。意味着我搞懂了,就能超越平凡的大多数,能力又上升了一个台阶。一...