gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:37:37 25 4
gpt4 key购买 nike

我正在尝试将 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”,进行编织时输出“false”。

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

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

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

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

最佳答案

实际上并不是编织过程失去了定型。我最近在 AspectJ bug 下调查了类似的事情:https://bugs.eclipse.org/bugs/show_bug.cgi?id=441741

在调查中,我发现了一条似乎适用于此处的 Java 规范,其中表示“匿名类始终是内部类;它永远不是静态的。”

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

作为一种解决方法,您可以使用 javac 对其进行编译,然后使用 ajc 将其进行二进制编织 - 这将保留“true”修饰符。

我不确定这个标志的设置是否值得依赖。

关于java - 如何避免 ajc 在编织时更改匿名类静态修饰符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25447483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com