java - Java 编译器插件可以更改已编译程序的 AST。这是黑客攻击还是官方支持?

标签 java plugins compiler-construction

在 Java 中,编译器插件是通过子类化 com.sun.source.util.Plugin(在 Java 11 中)创建的。 Java编译器插件使用继承自Tree的类, https://docs.oracle.com/en/java/javase/11/docs/api/jdk.compiler/com/sun/source/tree/Tree.html 这些类似乎不允许更改 AST。但是,有些插件,如中所述 https://bkushigian.github.io/2018/06/03/optimizing-javac-plugin.htmlhttps://www.baeldung.com/java-build-compiler-plugin 改变 AST。问题是:这是黑客攻击吗?

最佳答案

不是黑客攻击。这些示例是旧的/误导性的(任何使用 Method.setAccessible(true) 的东西总是一种黑客行为),但是 com.sun.tools.javac.tree.TreeScanner 访问者和 TreeMaker 工厂与 javac API 一样官方。

来自他们的 javadoc:

This is NOT part of any supported API. If you write code that depends on this, you do so at your own risk. This code and its internal interfaces are subject to change or deletion without notice.

这是他们创新的自由,而编译器不会像主要的 JLS/JDK 有时那样成为向后兼容的困惑。您可以理解为什么他们需要此声明,我不认为这是黑客行为,而是对您随着时间的推移可能需要的 future 维护量的警告。恕我直言,子类 TreeScanner 非常适应 future 的语言变化,并且随着新语言功能的推出,我预计不会出现根本性的不兼容性。

关于java - Java 编译器插件可以更改已编译程序的 AST。这是黑客攻击还是官方支持?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58579264/

相关文章:

language-agnostic - 是否有任何 self 改进的编译器?

c++ - AIX 5 中的 xlc 是否支持 c++ abi?

c# - 禁止在第三方dll插件中启动表单(c#服务)

java - Android Libgdx - 无法保存在文件中

java - 在 Java 中使用已编译的 DLL 与 SWIG 和 Visual Studio 2015

java - Scala:java.lang.VerifyError - 函数参数不兼容 - 运行时错误

java - 如何在这个循环中获得延迟?

perl - 为什么我的 perl Catalyst redirect_and_detach 替换插件方法失败?

c# - 从字符串解析计算树

java - Jersey2 中@Immediate 注解的使用