修补或覆盖核心 Java 10 类的实现

2022-09-03 15:40:46

JFX中存在一个错误,该错误通常在计算屏幕坐标时表现出来,https://bugs.openjdk.java.net/browse/JDK-8194727https://bugs.openjdk.java.net/browse/JDK-8190400

我已经将问题追溯到GeneralTransform3D的实现,它是javajfx运行时的一部分。

我已经向Oracle提交了一份错误报告,但在它被接受,修复并发布到版本之前,我需要一种方法来修复我的应用程序。

在java 8中,我能够创建一个包含该类的固定版本的jar,并将其安装在lib / ext文件夹中。这似乎有效,JFX实现使用我的impl而不是它自己的。

在java 10中,扩展机制已被删除。将补丁 jar 添加到类路径不起作用,因为在类加载过程中为时已晚。

有没有办法覆盖/修补Java 10中核心java类的实现?

请注意,我没有直接使用这个类,它由框架使用


答案 1

艾伦再次给出了最好的答案作为评论。:)报价:

--patch-module javafx.runtime=patch.jar是重写此模块中的类的正确方法

如果需要“重写”平台模块中的类,请使用 --patch-module 来执行此操作。如果这会拖累其他依赖项,请确保使用 --add-reads 使它们可读。


答案 2

我需要这样做,但我通过JNI接口(而不是命令行)从C启动Java。只是将命令行参数转置为 JavaVMOptions 是行不通的。相反,它全部在一个参数中,如下所示:

JavaVMOption options[N_ARGS] = { 0 };
options[0].optionString = "--patch-module=javafx.runtime=patch.jar";

我花了很多时间才弄清楚这一点,所以希望它能为其他人节省一些时间。


推荐