java - 我们如何使用 --patch-module 从 OpenJDK 11 覆盖 java.base/java.lang.Integer?

标签 java java-11 java-module openjdk-11 bootclasspath

在 JDK-8 中,我们可以编译更改后的 java.lang 类并重建 rt.jar .然后我们可以通过使用 -Xbootclasspath:<yourpathto>/rt.jar 扩充引导类路径来覆盖 java.lang 类文件。 .这样做,例如,我们可以使 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

docs对这种特殊用法不是很清楚。

来自 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像这样?

最佳答案

例子来自 Project Jigsaw为您的用例建模。请注意对 javac 和 java 使用 --patch-module。

--patch-module

Developers that checkout java.util.concurrent classes from Doug Lea's CVS will be used to compiling the source files and deploying those classes with -Xbootclasspath/p.

-Xbootclasspath/p has been removed, its module replacement is the option --patch-module to override classes in a module. It can also be used to augment the contents of module. The --patch-module option is also supported by javac to compile code "as if" part of the module.

Here's an example that compiles a new version of java.util.concurrent.ConcurrentHashMap and uses it at run-time:

    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

关于java - 我们如何使用 --patch-module 从 OpenJDK 11 覆盖 java.base/java.lang.Integer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63420048/

相关文章:

java - 使用 Java 创建 Hastebin Paste

java - 自动包含数字的模块名称

java - 模块不依赖于 Intellij IDEA 2017.2.5 Java 9

java - PermGen 大小不会扩展以填充最大可用空间

java - 找不到 Spring Boot Tomcat 类

java - Java 中的序列化是存储和稍后访问(少量)数据的最佳/最简单方法吗?

java - 从 java 10 升级到 java 11,从 gradle 4.10 升级到 gradle。 5.2 : "Variable not initialized in the default constructor"

java - 导航 View 创建产生错误和崩溃 Activity

java - JDK11 的 checkSystemClipboardAccess 替代方案

java - 是否需要在 module-info.java 和 build.gradle.kts 中指定模块依赖关系