如何在每个类中设置静态变量?

时间:2012-02-04 10:17:43

标签: eclipse aspectj

我正在尝试做一些非常简单的事情。我有一个com.mypackage.Logger logger类,其实例化语句我想“插入”每个类,如:private static Logger LOG = new Logger(Class.class)。然后,我想记录项目中每个函数的每个入口和出口实例。这是我的方面:

public aspect LoggingAspect pertypewithin(*) {

   private static Logger LOG;

   pointcut classes(): within(com.mypackage..*) && !within(com.mypackage.Logger) && !within(com.mypackage.LoggingAspect);
   pointcut functions(): classes() && (execution(* *(..)) || execution(new(..)));

   before(): staticinitialization(*) && classes() {
      LOG = new Logger(thisJoinPointStaticPart.getSignature().getDeclaringType());
   }

   before() : functions() {
      LOG.trace("ENTER " + thisJoinPoint.getSignature().toLongString());
   }


   after() returning(@SuppressWarnings("unused") Object ret) : functions() {
      LOG.trace("EXIT " + thisJoinPoint.getSignature().toLongString());
   }

几乎一切正常。我正确地按预期正确输入和存在日志语句。问题是与每个日志条目关联的日志记录类不正确。我正在使用log4j,每个日志条目的格式如下:

[TRACE](日期和时间戳)(日志记录类名)(线程名称)(一些日志记录语句)

问题是Logger实例化中使用的日志记录类与thisJoinPoint.getSignature().getDeclaringTypeName()指示的正确日志记录类不匹配。

我知道我在静态Logger变量方面做的不对,所以请帮助我。谢谢你的时间!!!

1 个答案:

答案 0 :(得分:2)

很简单

您的LOG属性被定义为私有静态。静态意味着类属性,而不是实例属性。

这显然与您方面的 instanciation模型相矛盾, pertypewithin (为每种类型创建的方面的一个实例)。

尝试删除静态修饰符。

顺便说一句,定义 pertypewithin()*非常大,你可以用 pertypewithin(classes())来限制匹配

对于日志记录的东西,我已经使用instanciation模型&做了一些AspectJ的实验。类型间声明。我会建议使用类型间声明实现,因为它更节省内存:

Logger injection with perthis

Logger injection with inter-type declaration