Исправить или переопределить реализацию основного класса Java 10
В JFX есть ошибка, которая часто проявляется при вычислении координаты экрана https://bugs.openjdk.java.net/browse/JDK-8194727 и https://bugs.openjdk.java.net/browse/JDK-8190400
Я отследил проблему до реализации GeneralTransform3D, которая является частью среды выполнения javajfx.
Я отправил отчет об ошибках в Oracle, но пока он не будет принят, исправлен и не будет выпущен, мне нужен способ исправления моего приложения.
В java 8 я смог создать банку с фиксированной версией класса и установить ее в папку lib/ext. Это, казалось, сработало, и реализация JFX использовала мой impl свой.
В java 10 механизм расширения был удален. Добавление патча-патча в путь к классам не работает, поскольку слишком поздно в процессе загрузки классов.
Есть ли способ переопределить/исправить реализацию основных классов Java в Java 10?
Обратите внимание, что я не использую этот класс напрямую, он используется инфраструктурой
Ответы
Ответ 1
Еще раз, Алан дает лучший ответ в качестве комментария. :) Цитата:
--patch-module javafx.runtime=patch.jar
- это правильный способ переопределить классы в этом модуле
Если вам нужно "переопределить" класс в модуле платформы, для этого используйте --patch-module
. Если это затягивает дополнительные зависимости, убедитесь, что они читаются с помощью --add-reads
.
Ответ 2
Похоже, что решение возможно с помощью java-агентов, в соответствии с этим вопросом
Заменить класс в библиотеке классов Java на пользовательскую версию
Ответ 3
Мне нужно было сделать это, но я запускал Java из C через интерфейс JNI (вместо командной строки). Простое перемещение аргументов командной строки в JavaVMOptions не сработало. Вместо этого все идет в одном аргументе следующим образом:
JavaVMOption options[N_ARGS] = { 0 };
options[0].optionString = "--patch-module=javafx.runtime=patch.jar";
Чтобы понять это, потребовалось немало усилий, так что надеюсь, что это сэкономит кому-то еще время.