3

在 JDK-8 中,我们可以编译我们更改的 java.lang 类并重建rt.jar. 然后我们可以通过在 bootclasspath 中添加-Xbootclasspath:<yourpathto>/rt.jar. 这样做,我们可以例如使 java.lang.Integer 成为非最终的以用于测试目的。

在 JDK-11 中,这是不同的。修补是通过完成的--patch-modules,我无法让它工作。我做了以下事情:

  1. 去掉 final 修饰符并从 openjdk-11 源重新编译 java.base 模块
  2. 添加了--patch-module java.base=<path-to-my-compiled-java.base-directory>
  3. 它仍然失败error: cannot inherit from final Integer。可能我们不能再覆盖 JDK 源文件的类声明了?那会很奇怪。
  4. 我还尝试将这些类文件添加到 jar 并尝试将所有可能的根目录传递给--patch-module参数
  5. 我尝试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

4

1 回答 1

2

Project Jigsaw中的示例为您的用例建模。注意 javac 和 java 都使用了 --patch-module。

--patch-module

从 Doug Lea 的 CVS 中检出 java.util.concurrent 类的开发人员将用于编译源文件并使用 -Xbootclasspath/p 部署这些类。

-Xbootclasspath/p 已被删除,它的模块替换是选项 --patch-module 来覆盖模块中的类。它也可以用来扩充模块的内容。javac 也支持--patch -module选项来编译代码“好像”模块的一部分。

这是一个编译新版本的 java.util.concurrent.ConcurrentHashMap并在运行时使用它的示例:

    javac --patch-module java.base=src -d mypatches/java.base \
        src/java.base/java/util/concurrent/ConcurrentHashMap.java

    java --patch-module java.base=mypatches/java.base ...

检查您的源路径是否与您的 --patch-module 目录对齐,即,是否有文件 src/java.base/java/lang/Integar.java 并且它是否在您的源路径中?

更新

这是一个示例项目,演示了如何隐藏 java.lang.Integer:https ://dl.dropbox.com/s/6swet2k89vukxbm/patch.zip

编译:

javac --patch-module java.base=src -d mypatches/java.base src/java.base/java/lang/Integer.java
javac --patch-module java.base=mypatches/java.base -d target src/main/java/com/example/MyInteger.java src/main/java/com/example/RunMe.java

跑:

java --patch-module java.base=mypatches/java.base -classpath target com.example.RunMe
于 2020-08-15T08:26:54.363 回答