如何在方面主题的代码中提供ITD?

时间:2011-12-07 18:08:07

标签: aspectj

我不确定我的术语是否正确,但这就是我想要的。我有一个方面,将Log字段注入某些类型,这里是方面代码:

public aspect LoggingAspect {
  private interface HttpHandlerType {}
  declare parents: (@Path *) implements HttpHandlerType;

  private Logger HttpHandlerType.Log = Logger.getLogger(getClass());

  pointcut httpHandlerMethods(HttpHandlerType o) : within(HttpHandlerType+) && 
    execution(@(GET || PUT || POST || DELETE) public * *.*(..)) && this(o);

  before(HttpHandlerType o): httpHandlerMethods(o) {
    if (o.Log.isInfoEnabled()) {
      o.Log.info(logMethod(thisJoinPoint));
    }
  }

  after(HttpHandlerType o) returning (Object result): httpHandlerMethods(o) {
    if (o.Log.isDebugEnabled()) {
      o.Log.debug(logMethod(thisJoinPoint, result));
    }
  }

  after(HttpHandlerType o) throwing (Exception e): httpHandlerMethods(o) {
    if (o.Log.isEnabledFor(Level.ERROR)) {
      o.Log.error(logMethod(thisJoinPoint), e);
    }
  }

  private static String logMethod(JoinPoint jp) {
    ...
  }

  private static String logMethod(JoinPoint jp, Object result) {
    ...
  }
}

问题是方面主题如何利用这个领域。例如,以下是受此方面影响的示例类:

@Path("user")
public class UserHandler {
  @GET
  @Path("{id}")
  public User getUser(@PathParam("id") int id) {
    ...
  }
}

问题是getUser的代码如何利用方面注入的Log字段?

感谢。

1 个答案:

答案 0 :(得分:0)

只需将日志字段的可见性从私有更改为公共,这应该有效。