【问题标题】:How to set a static variable in every class?如何在每个类中设置一个静态变量?
【发布时间】:2012-02-04 10:17:43
【问题描述】:

我正在尝试做一些非常简单的事情。我有一个 com.mypackage.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 变量方面做得不对,所以请帮助我。谢谢你的时间!!!

【问题讨论】:

    标签: eclipse aspectj


    【解决方案1】:

    很简单

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

    这显然与你的切面的实例化模型相矛盾,即pertypewithin(为每种类型创建一个切面实例)。

    尝试删除 static 修饰符。

    顺便说一下,pertypewithin()*的定义比较大,可以用pertypewithin(classes())来限制匹配

    对于日志记录,我使用实例化模型和类型间声明对 AspectJ 进行了一些实验。我建议使用类型间声明来实现,因为它更节省内存:

    Logger injection with perthis

    Logger injection with inter-type declaration

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-15
      • 2014-09-22
      • 2018-08-18
      • 2012-12-21
      • 1970-01-01
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多