读码农翻身之动态代理
1、为什么需要动态代理?
原因:不能在运行时修改一个类,导致不能用声明的方式来编程。(以我个人观点来看,在实际工作做还没有遇到过在程序运行的时候去修改一个类。可能是自己孤陋寡闻了)
2、什么是在运行时修改一个类?
如:下面这个类中有两个方法
当这个类运行起来后,要能做到在运行的时候修改这个类,比如在这个类中加一个新方法等等
3、什么是声明的方式编程?
实际需求中,写完代码以后,比如像在某些函数调用前后加上日志记录、事务、权限控制等等,这些需求是通用的,但是如果在每个函数中都实现一遍,重复代码太多。故希望在xml文件或者其他什么地方声明一下, 然后就能实现功能。
如:
(AOP能够读取这个xml中的声明,并且能够找到那些需要插入日志的类和方法,但是要修改这些方法的时候,却发现java不支持去修改运行中的类。)
4、如何解决“不能在运行时修改一个类,导致不能用声明的方式来编程。”的问题呢?
还是不能修改现有的类,但是可以在运行时动态的创建新的类!
比如需要在sayHello()方法中加入日志记录功能,那么就动态生成一个新类,然后让这个类作为HelloWorld的代理去做事情。(简称 动态代理)
动态代理的原理,无非就是在调用真正的方法之前,先调用Logger.startLog(),在调用之后再调用logger.end(),这就是对方法进行拦截了。
小结:这个动态代理的代码也太复杂了!