什么是动态代理
来源:互联网 发布:罗马全面战争火攻算法 编辑:程序博客网 时间:2024/06/14 22:58
动态代理就是可以任意的控制任意对象的执行过程,意思就是说这个对象的执行过程可以由客户端灵活的指定,可能这样说还是不太明确,通俗说就是
本来应该自己做的事情,因为没有某种原因不能直接做,只能请别人代理做。被请的人就是代理。比如春节买票回家,由于没有时间,只能找票务中介来买,这就是代理模式。
看下面的例子:
假如有一个用户的实体类叫User
Java code
package org.chinasoft.proxy.test; /** * 用户实体类 * @author lilei * */public class User { private String id; public User(String id) { this.id = id; } public String getId() { return id; } public void setId(String id) { this.id = id; } }
实现对实体类User类的数据管理,UserDAO
Java code
package org.chinasoft.proxy.test; public interface UserDAO { //可以有很多的方法(del,update,query...) void addUser(User user); }UserDAO的实现
package org.chinasoft.proxy.test; public class UserDAOMySQLImpl implements UserDAO { public void addUser(User user) { // connect to MySQL,insert a row recoder System.out.println("connect to MySQL DataBase..."); System.out.println("id=" + user.getId() + "的用户信息成功添加到数据库表中..."); } }现在假如说,有这样一个需求,就是说想在把用户添加到数据库调用addUser方法之前和之后记录下当前操作的
的日志(比如某某用户被添加到数据库等等)
LogHandler类,功能是负责控制任意被代理对象中任意方法的执行过程,简单说具体到本类中功能就是记录方法
运行前后的日志
package org.chinasoft.proxy.test; import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method; public class LogHandler implements InvocationHandler { //持有被代理对象的引用(此引用可以有外部灵活制定的) private Object target; public LogHandler(Object target) { this.target = target; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("开始记录日志,添加用户方法开始执行..."); method.invoke(target, args); System.out.println("开始记录日志,添加用户方法执行结束..."); return null; } }
测试类:TestProxy
package org.chinasoft.proxy.test; import java.lang.reflect.Proxy; public class TestProxy { public static void main(String[] args) { UserDAO daoImpl = new UserDAOMySQLImpl(); //拿到实现被代理类(UserDAO)的实现类的对象 UserDAO dao = (UserDAO)getInstance(daoImpl); User user = new User("001"); dao.addUser(user); } /** * * @param dao 被代理的对象 * @return 返回的是实现了被代理对象的对象(JDK $Proxy0) */ public static Object getInstance(UserDAO dao) { Object o = Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{UserDAO.class}, new LogHandler(dao)); return o; } }程序运行
开始记录日志,添加用户方法开始执行...connect to MySQL DataBase...id=001的用户信息成功添加到数据库表中...开始记录日志,添加用户方法执行结束...
阅读全文
0 0
- 什么是动态代理
- 什么是动态代理
- 什么是动态代理
- 什么是动态代理?动态代理是如何实现的?动态代理有哪些应用?
- 什么是AOP系列之:用Java动态代理实现AOP
- 什么是反向代理?正向代理
- 代理-->静态代理&动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- HDU 5988 2016青岛区域赛 (最小费用流)
- C语言实现atoi和itoa(字符串与数字之间的转化)
- gogs的windows安装
- codeforces 848C C. Goodbye Souvenir cdq分治
- jvm的简单了解及实现
- 什么是动态代理
- python面向对象
- 工厂模式
- jmeter请求结果乱码问题
- python3 入门指南
- Android中推荐用SparseArray替换HashMap<Integer,Object>
- iOS学习笔记-119.多线程18——NSOperationQueue自定义NSOperation执行一个操作的取消
- AOJ0118 Property Distribution(DFS)
- python简单游戏设计