动态代理就是可以任意的控制任意对象的执行过程,意思就是说这个对象的执行过程可以由客户端灵活的指定,可能这样说还是不太明确,通俗说就是
本来应该自己做的事情,因为没有某种原因不能直接做,只能请别人代理做。被请的人就是代理。比如春节买票回家,由于没有时间,只能找票务中介来买,这就是代理模式。
看下面的例子:
假如有一个用户的实体类叫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的用户信息成功添加到数据库表中...
开始记录日志,添加用户方法执行结束...