现在我们已经知道,InvocationHandler的invoke()方法能够帮助我们解决问题。那么再来解决一个新问题——怎样才能在方法执行的前后执行操作呢?说的更具体一些,我们能通过添加多个aop(before、after、around)来hook一个方法吗(译注:原文为add multiple aops,但我认为Handler是充当Aspect的角色)?答案同样是肯定的。按照以下的步骤建立一个精简的代码模板便能满足这样的需求:
  创建一个抽象类,用于将aop应用于目标对象上。
  创建名为BeforeHandler 和 AfterHandler的两个aop。前者在方法执行之前工作,而后者则在方法执行结束后工作。
  创建一个代理类,使所有的aop handler和目标对象只需作为参数传入,能创建一个hook。
  加入你自己的业务逻辑或者横切关注点。
  后,通过传入相关的参数创建代理对象(proxy object)。
  技术实现概要
  (译注:此处是核心代码片段,如果想运行该实例,需进入下方提供的链接下载完整代码)
  创建一个handler的抽象类:
  public abstract class AbstractHandler implements InvocationHandler {
  private Object targetObject;
  public void setTargetObject(Object targetObject) {
  this.targetObject = targetObject;
  }
  }
  创建名为BeforeHandler和AfterHandler的两个易扩展的handler抽象类:
  public abstract class BeforeHandler extends AbstractHandler {
  public abstract void handleBefore(Object proxy, Method method, Object[] args);
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  handleBefore(proxy, method, args);
  return method.invoke(getTargetObject(), args);
  public abstract class AfterHandler extends AbstractHandler {
  public abstract void handleAfter(Object proxy, Method method, Object[] args);
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  Object result = method.invoke(getTargetObject(), args);
  handleAfter(proxy, method, args);
  return result;
  }
  }
  创建Proxy的工厂类:
  public class ProxyFactory {
  public static Object getProxy(Object targetObject,
  List handlers) {
  //Code to get the proxy
  return proxyObject;
  } else {
  return targetObject;
  }
  }
  }
  以下为测试代码:
  CalculatorImpl calcImpl = new CalculatorImpl();
  BeforeHandler before = new BeforeHandlerImpl();
  AfterHandler after = new AfterHandlerImpl();
  List<AbstractHandler> handlers = new ArrayList<AbstractHandler>();
  handlers.add(before);
  handlers.add(after);
  Calculator proxy = (Calculator) ProxyFactory.getProxy(calcImpl,
  handlers);
  int result = proxy.calculate(20, 10);
  配置
  以上的代码片段简明扼要地解释了AOP在结构上的实现(structural implementation)。当然,如果能通过实际的测试将其运用到现实中去,那再好不过了。读者可在下面的链接中获取完整的工程文件,并在Java编辑器中配置它们,后通过其中的测试类来检验效果。
  https://github.com/debjava/aopusingjdkdynamicproxy
  总结
  希望这篇简短的有关AOP文章能够帮助到大家。需说明的是,本文只实现了before和after两种aop,而另外两种,即“Around”和“Throw”,则希望读者自行完成。