如何避免ajc在编织时更改匿名类静态修饰符?

时间:2014-08-22 12:51:38

标签: java akka aspectj

我正在尝试将AspectJ集成到现有项目中。编织后,匿名静态类变为非静态类 例如这段代码:

public class StaticCheck {
    public static void main(String[] args) {
        new Runnable() {
            @Override
            public void run() {
                System.out.println(Modifier.isStatic(getClass().getModifiers()));
            }
        }.run();
    }
}

输出“true”而不编织和“假”。

问题是以这种方式创建的对象被传递给第三方代码并在那里执行此检查。

将匿名类移动到静态内部类可以解决问题,但这是不可取的,因为这样的构造在项目中被大量使用。

我通过aspectj-maven插件和java 1.7使用aspectj 1.8.2版 第三方框架是类型安全的akka​​,这是Props.create(Creator)actor创建构造。

那么有什么方法可以避免这种方面的行为吗?

1 个答案:

答案 0 :(得分:1)

实际上编织过程并没有失去设置。我最近在AspectJ错误下调查过这样的事情:https://bugs.eclipse.org/bugs/show_bug.cgi?id=441741

在调查中我发现了一条似乎适用于此的java规范,其中说#34;匿名类总是一个内部类;它永远不会是静止的。"

Javac将这些东西标记为静态。 Eclipse Compiler for Java(AspectJ在内部使用)并未将其标记为静态。如果您在eclipse中编译并运行示例代码,它将打印为false。所以它不是编织,而是编译器正在进行编织。

作为一种解决方法,您可以使用javac进行编译,然后使用ajc对其进行二进制编码 - 这将保留' true'改性剂。

我不确定此标志的设置是否应该依赖。