手写一个动态代理框架
一:代理认知
1、在JAVA里什么是动态代理?
个人理解:这里的动态代理首先要明确代理的对象是什么,当然是代理类。
2、代理类能干什么?
首先类具有什么,无非就是属性和方法,代理属性没多大意义,所以必然是代理类方法。
3、为什么需要代理方法,直接调用不更好么?
当然不是,通常我们想去调用目标类A的方法method(),我们并非是直接调用,而是需要添加一些逻辑,同时又去调用A.method()。
4、直接在A方法里改不行么?
肯定不行,如果A.method()方法此时已经被许多地方调用,直接修改method(),势必会带来不可控的风险。所以我们对A.method()进行封装,这里我们常用的技术手段有:装饰器模式、代理模式等
二、在java中代理类的方式有哪些:静态代理(staticProxy)、动态代理(dynamicProxy)
2.1:动态代理又有:jdk里的Proxy.newProxyInstance,通过method.invoke来去调用真正的A.method().
2.2: 其次动态代理的另外一种实现方式:cglib,其中cglib提供了Enhancer和MethodProxy.invokeSuper来实现
这里需要说明的是:cglib并非是jdk提供的
三、静态代理
3.1静态代理实现方式一:继承目标类
3.2静态代理实现方式二:通过实现目标接口
四、动态代理
4.1jdk的动态代理实现
4.2cglib的动态代理实现
4.2.1依赖cglib包
4.2.2
五、手动实现动态代理
这里我们实现的思路如下:
5.1先去写一个java 文件的字符串
5.2然后通过代码生成指定路径下的.java文件
5.3通过jdk为我们提供的JavaComplier来生成.class文件
5.4再通过ClassLoader将.class文件加载到jvm当中,并返回一个class对象
5.5最后通过反射class对象生成我们的代理类的实例对象
这里实现了一个自定义的ClassLoader
核心代码如下:
六、总结
说了这么多,代理到底能干什么?
说白了其实就是对目标方法进行增强,满足新的业务需要。
为什么动态代理又独受恩宠,因为静态代理会让我们的代码冗余非常多,如果我们需要对上千个接口进行增强,那么代理类的数量和目标类的比例为1:1.所以才出现了动态代理,在这里动态代理会为我们省去大量的冗余代码