动态代理
来源:互联网 发布:如何专卖自己的域名 编辑:程序博客网 时间:2024/05/21 20:48
一辆坦克,有move()方法,现在要不改变坦克类,且能加上日志。
package com.test.myproxy.dongtai;public interface Moveable {public void move();}
package com.test.myproxy.dongtai;public class Tank implements Moveable {@Overridepublic void move() {System.out.println("moving");}}
日志代理类:
package com.test.myproxy.dongtai;import java.lang.reflect.InvocationHandler;public class LoggerHandler implements InvocationHandler {private Object obj;public LoggerHandler(Object obj) {super();this.obj = obj;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("日志开始");Object result = method.invoke(this.obj, args);System.out.println("日志结束");return result;}}
package com.test.myproxy.dongtai;import java.lang.reflect.InvocationHandler;public class Client {public static void main(String[] args) { Moveable m = new Tank(); InvocationHandler h = new LoggerHandler(m); //InvocationHandler th = new TranstractHandler(h); Moveable proxy = (Moveable)Proxy.newProxyInstance( m.getClass().getClassLoader(), m.getClass().getInterfaces(), h); proxy.move();}}
到这里,动态代理就实现了。
但有个问题,我只能代理一个日志,不能在日志的方法上再包一层事物
事物代理:
package com.test.myproxy.dongtai;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class TranstractHandler implements InvocationHandler {private Object obj;public TranstractHandler(Object obj) {super();this.obj = obj;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("事物开始");Object result = method.invoke(this.obj, args);System.out.println("插入日志表");System.out.println("事物结束");return result;}}
InvocationHandler th = new TranstractHandler(h); Moveable proxy = (Moveable)Proxy.newProxyInstance( m.getClass().getClassLoader(), m.getClass().getInterfaces(), th); proxy.move();
这段代码会抛 Exception in thread "main" java.lang.IllegalArgumentException: object is not an instance of declaring class
这个错误。不知道怎么改。。。
已找到解决办法:
package com.test.myproxy.dongtai;import java.lang.reflect.InvocationHandler;public class LoggerHandler implements InvocationHandler {private Object obj;public LoggerHandler(Object obj) {super();this.obj = obj;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("日志开始");Object result = null;if(this.obj instanceof InvocationHandler) {result = ((InvocationHandler)this.obj).invoke(proxy, method, args);} else {result = method.invoke(this.obj, args);}//事物代理中同样修改System.out.println("日志结束");return result;}}
阅读全文
0 0
- 代理-->静态代理&动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- C# 如何套用BootStrap 让页面美丽点
- 按照创建时间升序排列沙盒里的文件
- 线程池的原理
- 给我写信-->我的邮箱
- bootstrap创建带遮罩层的进度条
- 动态代理
- Sublime text 3 + python配置,完整搭建及常用插件安装
- ASP.NET状态管理之五(Cookie)
- Super Jumping! Jumping! Jumping!杭电1087
- Packet for query is too large(mysql写入数据过大)
- inotify+ rsync window同步linux服务器文件夹
- Sass 和 SCSS 有什么区别?
- jdbc 更新 测 并发
- hibernate 把类输出成数据库表