Я пытаюсь сделать то же самое в Java 11, что можно сделать с помощью -Xbootclasspath/p:path
в pre 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
.Само существование этого класса в моей папке с патчами, кажется, провоцирует эту ошибку.(Я хотел добавить только поле внизу класса)
ПРИМЕЧАНИЕ. Я только что подумал, что это работает, когда класс ClassLoader
скомпилирован с Eclipse.Одно из немногих отличий, которое я знаю, заключается в том, что компилятор Eclipse, похоже, пока не следует JEP 280 .Но в байт-коде есть также инструкции invokedynamic
, полученные из javac
, поэтому я сомневаюсь, что это проблема.