Как выгрузить недопустимый класс из загрузчика классов (связанный с ByteBuddy)? - PullRequest
0 голосов
/ 01 марта 2020

Я прочитал пару вопросов, связанных с общей проблемой выгрузки / перезагрузки класса во время выполнения, и, похоже, это сложная и несколько сложная проблема. Интересно, однако, как обстоят дела с классами, которые явно инструментированы во время выполнения, используя отдельный ClassLoader, предназначенный для этой цели, и не имеют никакого экземпляра (потому что либо конструктор всегда выдает исключение, либо класс даже не прошел проверку JVM)?

Я пытаюсь глубоко смоделировать произвольные графы классов модели предметной области (код библиотеки). Это scala, что означает, что это классы без конструкторов по умолчанию и которые вообще не принимают значения null в целом, поэтому мне нужно создать экземпляр всех аргументов (и, в свою очередь, часто рекурсивно обрабатывать их подклассы). Это, очевидно, иногда может потерпеть неудачу - как часто зависит от стиля кодирования и сколько проверки выполняется в конструкторе. Поскольку я уже сталкиваюсь с риском насмешки над гораздо большим графиком из-за зависимостей, которые были бы желательны, я стараюсь ограничиться одним лучшим выстрелом при создании класса и разочароваться в неудаче, а не пробовать разные конструкторы или другие значения, что, по крайней мере, теоретически может увеличить мой успех.

В настоящее время я использую ByteBuddy и, учитывая, насколько он всеобъемлющий, кажется, что-то уже можно сделать?

1 Ответ

1 голос
/ 03 марта 2020

Как говорит Хольгер, загрузчики классов (и их классы) выгружаются, как только становятся недоступными. По умолчанию Byte Buddy загружает все классы в отдельный загрузчик классов, но вы можете управлять этим поведением, используя явный ClassLoadingStrategy в качестве второго аргумента метода DynamicType.Unloaded::load.

...