模拟AOP 面向切面编程

来源:互联网 发布:php面向对象 编辑:程序博客网 时间:2024/05/09 04:22
模拟AOP 面向切面编程
假设我们有个类UserDAO 里面有个save方法我们现在要在这个方法前加一个日志
当然我们可以创建一个日志类,然后将测试代码组合到源代码,不过这样已经改动了源代码了
所以我们用动态代理来解决这个问题



LogInterceptor.java===============
public class LogInterceptor implements InvocationHandler {
private Object target;
public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
}
public void beforeMethod(Method m) {
System.out.println(m.getName() + " start");
}
public Object invoke(Object proxy, Method m, Object[] args)
throws Throwable {
beforeMethod(m);
m.invoke(target, args);
return null;
}
}


UserDAOImple.java=====================
public class UserDAOImpl implements UserDAO {
public void save(User user) {
System.out.println("user saved!");
}
public void delete() {
System.out.println("user deteleted");
}
}


Test.java========================用于测试.
public void testProxy() {
UserDAO userDAO = new UserDAOImpl();
LogInterceptor li = new LogInterceptor();
li.setTarget(userDAO);
UserDAO userDAOProxy = (UserDAO)Proxy.newProxyInstance(userDAO.getClass().getClassLoader(), userDAO.getClass().getInterfaces(), li);
System.out.println(userDAOProxy.getClass());
userDAOProxy.delete();
userDAOProxy.save(new User());

}
0 0
原创粉丝点击