Плагин компилятора Java может изменить AST скомпилированной программы. Это взлом или официально поддерживается? - PullRequest
0 голосов
/ 27 октября 2019

В 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.html и https://www.baeldung.com/java-build-compiler-plugin, изменяют AST. Вопрос: это взлом?

1 Ответ

0 голосов
/ 27 октября 2019

Не взломать. Примеры старые / вводящие в заблуждение (что-либо, использующее Method.setAccessible(true), всегда является хаком), но посетитель com.sun.tools.javac.tree.TreeScanner и фабрика TreeMaker так же официальны, как и API javac.

Из их javadoc:

Это НЕ является частью какого-либо поддерживаемого API. Если вы пишете код, который зависит от этого, вы делаете это на свой страх и риск. Этот код и его внутренние интерфейсы могут быть изменены или удалены без уведомления.

Это их свобода вводить новшества без компилятора , ставшего обратно совместимым беспорядком, подобным основному JLS /JDK иногда есть. Вы можете понять, почему им понадобится это заявление, и я не считаю это хаком, а предупреждением о том, какое количество будущего обслуживания вам может понадобиться со временем. ИМХО подклассификация TreeScanner вполне учитывает будущие языковые изменения, и я не ожидаю фундаментальных несовместимостей по мере появления новых языковых функций.

...