jdk动态代理(底层动态生成代理类和编译过程)

     Java动态代理,顾名思义,动态的生成代理对象。其实难点就在这里—动态。到底怎么动态生成。代理解决的问题就是增强类。其实,实现代理的方式很多种,比如继承,子类对一个类增强,我们可以认为子类就是一个代理类,在比如组合,组合简单理解就是在类中注入要增强类的对象。组合和继承都能实现代理。但是问题是,这种增强没有通用性。为什么这么说,举个例子:当我们操作数据库,我们首先开启事务,提交事务或者回滚事务,此时有个需求要在整个事务执行过程种记录事务运行时间,我们的做法用继承,我们加一个类来继承实现了开启事务,提交事务或者回滚事务这个类,再此基础上去添加记录时间的逻辑。如果又有需求记录运行时的日志。你TM是不是又加一个类,去加添加日志的逻辑。以我的编程思维来看,TMD只要能实现了,就可以了,粘贴复制能跑就行。可是我现在思维转变了,我决定去了解一下,计算机大佬是怎么来思考的。刚开始编程初学者来说,动态代理确实比较困难,因为要一定的理解能力,面向对象思想,多态,反射等知识是需要掌握的。好吧,不扯淡了,因为我主要从事java开发,就写jdk动态代理吧。刚才说到难点就在动态。我们知道Java是编译型语言。在运行之前,是需要编译的。但是,jdk动态代理就是在程序运行时,TMD会生成代理类的java文件,而且还通过某种方式编译生成.claas文件。神不神奇。我第一感觉是,Java从入门到放弃就在此时开始。

程序运行时生成Java文件倒是不难,但是怎么把生成的文件编译呢。TMD,还真别说,Java开发者确实是天才,我查了一下Api:

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

这个就能完成类Java文件的编译。如此以来,动态是不是解决了呢,我觉得是解决了。开始上代码:这段代码,是模拟Java的动态代理原理,并不是JDK自身的实现。是我自己模拟的,虽然类名和函数名和jdk Api一样。

1.接口

 

2.实现接口的目标类(它要被代理

 

 

3.代理处理接口(实现这个接口类,处理了要增强的逻辑)

4.处理器

   

 5.代理逻辑(核心,看不懂这个此类动态代理就无法理解,这块要理解反射)这个类会动态生成代理类$Proxy.java

,和编译后的$Proxy.class

 

6.测试

结果:

class com.pattern.strately.proxy.proxy.$Proxy1
starttime:1538227491273
com.pattern.strately.proxy.proxy.$Proxy1
Tank Moving...

注意:核心它会动态生成两个文件,这两个文件是代理的核心。

 

  • 13
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值