在 JDK-8 中,我们可以编译我们更改的 java.lang 类并重建rt.jar
. 然后我们可以通过在 bootclasspath 中添加-Xbootclasspath:<yourpathto>/rt.jar
. 这样做,我们可以例如使 java.lang.Integer 成为非最终的以用于测试目的。
在 JDK-11 中,这是不同的。修补是通过完成的--patch-modules
,我无法让它工作。我做了以下事情:
- 去掉 final 修饰符并从 openjdk-11 源重新编译 java.base 模块
- 添加了
--patch-module java.base=<path-to-my-compiled-java.base-directory>
- 它仍然失败
error: cannot inherit from final Integer
。可能我们不能再覆盖 JDK 源文件的类声明了?那会很奇怪。 - 我还尝试将这些类文件添加到 jar 并尝试将所有可能的根目录传递给
--patch-module
参数 - 我尝试
package-info.class
从编译java.base
目录中删除模块并尝试显式java.base.java.lang.Integer
添加--add-opens
文档对这种特定用法并不十分清楚。
来自 maven 的整个 javac 命令(我已经尝试过 javac 和 maven-compiler-plugin):
javac -d ./target/classes -classpath <classpathfiles> -sourcepath <sourcefiles> -s ./target/generated-sources/annotations -g -nowarn -target 11 -source 11 -encoding UTF-8 --patch-module=java.base=../runtimejar/mods/src/java.base -Xplugin:Manifold
(缩短路径名称等以提高可读性)
我在这里想念什么?为什么我不能这样修改java.base/java.lang.Integer
?