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

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

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

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


person Turin    schedule 01.03.2020    source источник
comment
Правила не меняются. Когда загрузчик классов недоступен, он может собирать мусор, если JVM поддерживает это. Это требует, чтобы все его классы также были недоступны. Когда предварительные условия соблюдены, это все еще решает JVM.   -  person Holger    schedule 02.03.2020


Ответы (1)


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

person Rafael Winterhalter    schedule 03.03.2020
comment
Итак, может ли класс стать сборщиком мусора, даже если сам загрузчик классов не является таковым? - person Turin; 05.03.2020
comment
Нет, оба должны стать недоступными, поскольку они ссылаются друг на друга. - person Rafael Winterhalter; 05.03.2020