从Java 9访问com.sun.tools.javac.util

bra*_*aag 10 java sun java-8 java-9

我正试图从中访问List该类com.sun.tools.javac.util.这适用于Java 8,但是当切换到Java 9时,我收到以下错误:Package 'com.sun.tools.javac.util' is declared in module "jdk.compiler", which does not export it to the unnamed module".

我尝试添加requires jdk.compiler;到我的module-info文件,但这并没有解决问题.

Nam*_*man 8

从长远来看,处理这种情况的安全方法是不再使用JDK的这些内部API.

可以使用jdk.compiler模块的API作为com.sun.tools.javac包的替代品.

定义系统Java编译器及其命令行等效项javac以及javah的实现.

具体来说com.sun.tools.javac.util.List,几乎所有非重写的自定义方法都可以从基于接口的实现中派生出来java.util.List.


迁移指南关于Removed java.*API的专栏指出 -

Java团队致力于向后兼容.如果应用程序在JDK 8中运行,那么它将在JDK 9上运行,只要它使用支持并供外部使用的API即可.

这些包括:

  • JCP标准java.*,javax.*
  • JDK特定的API,一些com.sun.*,一些jdk.*

可以从JDK中删除支持的API,但只能通知.通过运行静态分析工具,了解您的代码是否使用了弃用的APIjdeprscan.

然后添加到上面突出显示的风险..

编译时间

封装在JDK 9中的内部API在编译时无法访问,但可以在编译时通过--add-exports命令行选项访问.

在你的情况下:

--add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED
Run Code Online (Sandbox Code Playgroud)

运行

在运行时,如果它们在JDK 8中,它们仍然可访问,但在将来的版本中,它们将变得不可访问,此时可以使用--add-exports--add-opens选项使它们在运行时也可访问.

  • 这些 API 没有被弃用;它们只是 javac 的内部接口,现在在 JDK 9 中默认无法访问。否则,是的。 (3认同)
  • 是的,*内部*是优选的.这些东西都没有被弃用.谢谢你的更新. (3认同)