java - 如何使用 Java 9+ 修改 AST
问题描述
我一直在尝试使用注释处理器修改 AST。我尝试扩展 Lombok,但这似乎太难了,所以我决定使用 com.sun.source.* 和 com.sun.tools.javac.* 中的东西。但是,我使用的是 java 11,以及我从中学习的文档, "The Hacker's Guide to Javac" http://scg.unibe.ch/archive/projects/Erni08b.pdf,使用Java 6。他们使用的api现在是内部的,我的模块无法读取它。
在 IntelliJ 中,它给了我一些错误,但我点击了建议(上面写着“将 --Xxx-xxx 添加到 xxx”之类的东西而没有注意它们。当我尝试使用 Maven 编译时,它失败了,因为模块不读取 jdk.compiler 的内部结构。
这些是我的一些进口:
import com.sun.source.util.Trees;
import com.sun.tools.javac.tree.JCTree;
import com.sun.tools.javac.tree.TreeMaker;
import com.sun.tools.javac.tree.TreeTranslator;
import com.sun.tools.javac.util.Context;
我的模块信息文件包含
requires jdk.compiler;
requires java.compiler;
我收到类似“[ERROR]package com.sun.tools.javac.util 在模块 jdk.compiler 中声明的消息,它不会将其导出到模块 OtherAnnot”和“[ERROR](包 com.sun.tools.javac.util)”。树在模块 jdk.compiler 中声明,它不会将其导出到模块 OtherAnnot)"
编辑:我想这是重复的,但我想知道在 java 9 中是否有一些用于 AST 转换的替代 API。
解决方案
随着 Project Jigsaw 的推出,JDK 已经模块化,允许用户创建自己的模块。这些模块允许您导出自己的包,允许需要您的模块(在它们的module-info.java
)中的程序使用导出的包。
理想情况下,您将被禁止使用驻留在未导出的包中的类。但是,为了不破坏向后兼容性,引入了 VM 标志,允许您将包(不属于您的)强制导出到您的模块。
鉴于您的错误消息,要添加的相应 VM 标志是:
--add-exports jdk.compiler/com.sun.tools.javac.tree=OtherAnnot
这里的模式是:
--add-exports THEIR_MODULE/THEIR_PACKAGE=YOUR_MODULE
如果编译器抱怨包没有导出到未命名的模块,那么您可以使用以下内容:
--add-exports THEIR_MODULE/THEIR_PACKAGE=ALL-UNNAMED
推荐阅读
- javascript - 使用 loadash 比较两个对象数组并返回一个具有共同值的数组
- javascript - 403 通过 Google-Drive-RESTAPI v3 创建文件夹
- qt - Qml样条图中的异常
- javascript - 将新数据传递给变量给了我错误
- android - 有视图包装内容,但如果空间可用,则匹配父级
- r - 连接具有相同后缀的变量对
- c++ - “new Foo()”和“&Foo()”作为参数的区别
- python - 我怎样才能实现类似 np.where(df[varaible] in ['value1','value2'])
- c++ - QtConcurrent::blockingMap vs QtConcurrent::map 和 waitForFinished
- jquery - 如何从 Jquery Tab Widget 调用 Jquery tabdrop() 插件?