在Java中捕获运行时方法的参数

时间:2011-03-23 17:48:31

标签: java aspectj

我们的应用程序使用多个后端服务,并且我们维护包含进行实际服务调用的方法的包装器。如果在调用服务时在任何这些方法中发生任何异常,我们会抛出一个封装原始异常的自定义异常,如下所示。

interface IServiceA {
 public void submit(String user, String attributes);
}

public class ServiceAWrapper implements IserviceA {
 private ActualService getActualService() {
  .....
 }

 public void submit(String user, String attributes) {
  try {
   Request request = new Request();
   request.setUser(user);
   request.setAttributes(attributes);
   getActualService().call(request);
  } catch(ServiceException1 e) {
   throw new MyException(e, reason1);
  } catch(ServiceException2 e) {
   throw new MyException(e, reason2);
  }
 }
}

我想知道是否有任何框架可以让我

  1. 捕获(并可能记录)所有 传递给我的包装器的参数 运行时的方法;如果方法 被称为。
  2. 捕获实际异常 object(上面的MyException实例 例如),如果有任何抛出;所以我 可以附加传递的参数 在运行时对象。
  3. 我正在探索AspectJ以查看它是否可以满足我的要求,但我不确定它是否可以用于捕获在运行时传递给方法的参数,以及捕获异常对象(如果有的话)。

    感谢。

3 个答案:

答案 0 :(得分:4)

使用AspectJ,您可以use around advice执行建议而不是连接点处的代码。然后,您可以通过调用proceed来执行建议中的实际连接点。这将允许您捕获输入参数,记录它们,然后继续调用实际方法。

在同一个建议中,您可以捕获从该方法抛出的任何日志,并在将其传回更高级别之前检查或记录它们。

答案 1 :(得分:3)

马特B的回答是正确的。具体来说,你可以这样做:

aspect MonitorServiceCalls {

  private final Logger LOG = LoggerFactory.getLog("ServiceCallLog");

  Object around() throws MyException: call(public * *(..) throws MyException) 
                                      && target(IServiceA+) {
    MethodSignature msig = (MethodSignature)thisJoinPoint;
    String fullMethName = msig.getMethod().toString();
    try {
      Object result = proceed();
      LOG.info("Successful call to {} with arguments {}", 
               fullMethName,
               thisJoinPoint.getArgs());
      return result;
    } catch(MyException e) {
      LOG.warn("MyException thrown from {}: {}", msig.getMethod(), e);
      throw e;
    }
  }
}

答案 2 :(得分:0)

AspectJ是正确的选择。您将能够通过将传递给您的advise方法的JoinPoint对象来获取参数。您也可以通过实施投掷后的建议或周围的建议来获得例外。