原文出处:http://mp.weixin.qq.com/s/de4XGeTzkAYe4sLo1m0B8g

动态代理:

AOP:

对于添加日志的需求:

可以指定某个包下面的所有的以add开头的方法,在执行前都要调用Logger.startLog(),在执行过后都要调用Logger.endLog()方法。

对于增加事务支持的需求:

所有以DAO结尾的类,所有的方法执行前都要调用TransactionManager.begin(),执行之后都要调用TransactionManager.commit(),如果抛出异常的话调用TransactionManager.rollback()。

但是java帝国不允许修改一个已经被加载或者正在运行的类。

添加一些限制,必须使用接口

java动态代理学习

但是又无法更改sayHello方法,怎么办使用一个新类作为HelloWorld的代理去做这些事情,这个新类实现IHelloWorld接口。对于调用者来说,都是实现了IHelloWorld,并无区别。

java动态代理学习

但是,Logger的代码应该具体加到什么地方?这里需要写一个类来告诉我们具体把Logger的代码加到什么地方,这个类必须实现InvocationHandle 接口,改接口中又一个invoke方法用了写扩展代码的地方。

java动态代理学习java动态代理学习


java动态代理学习

java动态代理学习

调用的时候,使用接口引用指向代理类,代理类利用handler来实现动态添加代码的功能。也可以使用其它的接口。

Proxy.newProxyInstance,动态生成了一个类。在运行时,在内存中生成了一个新类,这个类在调用sayHello或者add方法的时候,实际调用的是LoggerHanlder的invoke方法,从而invoke就会拦截真正的方法调用,添加日志功能了

相关文章: