gpt4 book ai didi

java - 修补 java.base 导致 java.lang.LinkageError

转载 作者:搜寻专家 更新时间:2023-11-01 02:35:35 24 4
gpt4 key购买 nike

我正在尝试在 Java 11 中做同样的事情,这可以用 -Xbootclasspath/p:path 完成在 Java 9 之前。

作为一个简单的例子,我修改了一个 valueOf java.lang.Integer 的方法并编译项目:

javac --module-source-path=src/java.base --patch-module java.base=src/java.base -d mods $(find src -name '*.java')

然后我运行了一个简单的示例:

java --patch-module java.base=<pathToMyModifiedJavaBaseClasses> -p lib -m my.moduleA/my.moduleA.Main

这行得通,我看到了显示的修改(我从 valueOf 打印出来的简单打印输出)。

但是,当我尝试对 java.lang.ClassLoader 做同样的事情时执行程序(编译工作)时出现以下错误:

Error occurred during initialization of boot layer
java.lang.LinkageError: loader 'bootstrap' attempted duplicate class definition for java.lang.invoke.SimpleMethodHandle.

我什至不需要在 java.lang.ClassLoader 中进行更改.该类在我的补丁文件夹中的绝对存在似乎引发了这个错误。 (虽然我只想在类(class)底部添加一个字段)

注意:我只是认为它在 ClassLoader 时有效类是用 Eclipse 编译的。我知道的少数差异之一是 Eclipse 编译器似乎不遵循 JEP 280然而。但是有invokedynamic javac 产生的字节码中的指令同样,所以我怀疑这是问题所在。

最佳答案

您确实已经指出了正确的方向。当您使用当前版本的 Eclipse 编译该类时,它会起作用,因为该编译器不遵循 JEP 280然而,所以它不使用 invokedynamic 进行字符串连接。

这并不意味着在 ClassLoader 中使用 invokedynamic 通常是有问题的。它仅在 java.lang.invoke 包的引导过程中执行的某些关键代码路径中存在问题,显然,此类确实在此代码路径上使用了字符串连接。

javac 的情况下,您可以通过选项强制使用旧的字符串连接代码
-XDstringConcat=内联。查看 JDK 附带的 ClassLoader.class 的字节码,似乎此类已使用此选项编译。事实上,查看一些样本,似乎整个 java.base 模块都是使用该选项编译的,与例如相反。 java.desktop,其类使用 invokedynamic 进行字符串连接。

所以结论是,要修补 java.base 模块(在 OpenJDK 和衍生产品中)中的类,使用 -XDstringConcat=inline 选项编译它们 javac

关于java - 修补 java.base 导致 java.lang.LinkageError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54635667/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com