java动态代理学习

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

动态代理:

AOP:

对于添加日志的需求:

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

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

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

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

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

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

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




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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值