Когда ссылки внутри класса разрешены, используется его определяющий загрузчик классов.Ваш код идентифицирует определяющий загрузчик классов для класса, который вы хотите использовать, но затем создает новый загрузчик классов, используя его в качестве родительского загрузчика.
Когда вы запрашиваете этот новый загрузчик для загрузки ваших классов, классы очень вероятно загружены , но они доступны только через только что созданный вами URLClassLoader
.Они недоступны для других загрузчиков классов.
Инструментарий классов с кодом, содержащим новые зависимости от других классов, может быть очень сложным.Если инструментированные классы были загружены загрузчиком классов приложения, вы можете использовать Instrumentation.appendToSystemClassLoaderSearch(JarFile)
, чтобы добавить свой Cheat.jar
в путь поиска, чтобы сделать классы доступными.
Для классовзагружается другими загрузчиками, все становится сложнее.Если они следуют стандартной модели родительского делегирования, вы можете использовать appendToBootstrapClassLoaderSearch(JarFile)
, чтобы сделать ваши классы доступными для всех этих загрузчиков классов.
Для загрузчика, который не следует модели делегирования, вы должны иметькопать глубже, например, использовать Reflection с переопределением доступа, вызвать defineClass
, чтобы сделать классы доступными в этой области.