java动态代理问题

a453164510 2012-02-15 07:58:47
以下是添加用户的一个动态代理,当然是别人的代码
我的问题是:假如现在还有一个需求,想记录下在添加用户成功之后,记录添加用户方法的运行时间,可以的话给我个实例,感谢!!!

用户的实体类User:

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


package org.chinasoft.proxy.test;

public interface UserDAO {
//可以有很多的方法(del,update,query...)
void addUser(User user);

}


不同UserDAO的实现:UserDAOMySQLImpl,UserDAOOracleImpl
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() + "的用户信息成功添加到数据库表中...");
}

}



UserDAOOracleImpl:
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() + "的用户信息成功添加到数据库表中...");
}

}


现在假如说,有这样一个需求,就是说想在把用户添加到数据库调用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的用户信息成功添加到数据库表中...
开始记录日志,添加用户方法执行结束...


我的问题是:假如现在还有一个需求,想记录下在添加用户成功之后,记录添加用户方法的运行时间,可以的话给我个实例,感谢!!!
...全文
106 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyp907093825 2012-02-17
  • 打赏
  • 举报
回复
用java发射机制,把对象传o进来,Method m=o.getClass().getDeclaredMethod("添加用户",Clss...class)在m.invoke(o,Object...)的前后得到系统时间,做一个时间差的比较就行啦!
a453164510 2012-02-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ldh911 的回复:]
如果你用的是Spring的话,借助其AOP能力,可以直接配置拦截器,做你需要的日志记录等工作。

这里有比较详细的介绍,建议参考下:

http://blog.163.com/chenhui_java/blog/static/172672494201010811346259/
[/Quote]

我想用jdk实现 可以吗
a453164510 2012-02-16
  • 打赏
  • 举报
回复
我想用jdk实现 你有办法吗
安特矮油 2012-02-16
  • 打赏
  • 举报
回复

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("开始记录日志,添加用户方法开始执行...");
method.invoke(target, args);
System.out.println("开始记录日志,添加用户方法执行结束...");
return null;
}


就在method.invoke的上下获取当前时间,其两个时间差就是方法执行时间。然后你持久化就可以了撒
MiceRice 2012-02-15
  • 打赏
  • 举报
回复
如果你用的是Spring的话,借助其AOP能力,可以直接配置拦截器,做你需要的日志记录等工作。

这里有比较详细的介绍,建议参考下:

http://blog.163.com/chenhui_java/blog/static/172672494201010811346259/

51,409

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧