51,409
社区成员
发帖
与我相关
我的任务
分享
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;
}
}
package org.chinasoft.proxy.test;
public interface UserDAO {
//可以有很多的方法(del,update,query...)
void addUser(User user);
}
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() + "的用户信息成功添加到数据库表中...");
}
}
package org.chinasoft.proxy.test;
public class UserDAOOracleImpl implements UserDAO {
public void addUser(User user) {
//connect to Oracle,insert a row recoder
System.out.println("connect to Oracle DataBase...");
System.out.println("id=" + user.getId() + "的用户信息成功添加到数据库表中...");
}
}
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;
}
}
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的用户信息成功添加到数据库表中...
开始记录日志,添加用户方法执行结束...
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("开始记录日志,添加用户方法开始执行...");
method.invoke(target, args);
System.out.println("开始记录日志,添加用户方法执行结束...");
return null;
}