Javassist: воссоздание класса - сначала удалить, или разморозить () и изменить?

Я использую Javassist для создания класса. И в наборе тестов, когда второй тест пытается создать тот же класс, он терпит неудачу вpool.makeClass( ... ) потому что класс заморожен (т.е. уже создан с помощью.toClass()

Какие'способ преодолеть это? В идеале первый тест должен как-то удалить класс - возможно, выгрузить из загрузчика классов - но, как я читаюв JLSоперация разгрузки не является надежной.

Так что, возможно, обходной путь - проверить в классе, создающем код, существует ли он, и если он существует,defrost() удалить все элементы и т. д. и заново создать его.

Есть еще идеи?

Или есть какой-нибудь надежный способ удалить класс через Javassist?

 Ondra Žižka27 нояб. 2013 г., 01:35
Это, кажется, ответ ... если вы так выразитесь, яприму.
 Holger26 нояб. 2013 г., 20:35
Разгрузка сClassLoader не является ненадежным это невозможно. Класс может быть выгружен, если она также егоClassLoader стало недоступным, но так как каждый класс ссылается на свой загрузчик, это подразумевает, чтовсе классы, загруженные этим загрузчиком, тоже должны были стать недоступными. Но вы можете (заново) создать класс, используяразные ClassLoader, Ну, формально это другой класс с тем же именем (и, возможно, с тем же байтовым кодом).

Ответы на вопрос(2)

я решил ее таким образом, может быть, не может подать заявку на ваш тестовый пример:

Сделайте CtClass закрытой статической переменной вашего класса.

Создать метод, который проверяетs, если CtClass уже построен. Если CtClass не создан, вызовите метод, который его создает, иначе верните этот CtClass.

Сделайте так, чтобы все ваши тесты использовали новый метод.

Итак, если у вас есть N Test, только первый попытается создать CtClass, остальные будут иметь статическую переменную CtClass.

ClassLoader, Класс может быть выгружен, если он и егоClassLoader стало недоступным, но поскольку каждый класс ссылается на свой загрузчик, это означает, что все классы, загруженные этим загрузчиком, тоже должны были стать недоступными.

Но вы можете (заново) создать класс, используя другойClassLoader, Ну, формально это другой класс с тем же именем (и, возможно, с тем же байтовым кодом). Если код, выполненный в тестовом примере, не оставляет ссылок в куче,ClassLoader и его классы могут быть собраны после теста.

 Holger20 окт. 2014 г., 15:21
И если экземпляры нового класса предназначены для замены старых в местах, где ожидается суперкласс или тип интерфейса, этот конкретный базовый тип или интерфейсдолжен быть разрешенным к тому же типу среды выполнения, чтобы разрешить замену при вставке.
 Pooya20 окт. 2014 г., 14:45
Хорошо, но если загруженный класс во втором ClassLoader имеет ссылки на другие классы первого ClassLoader, должны ли мы также добавить все ссылочные типы во второй ClassLoader? @ Пуя
 Holger20 окт. 2014 г., 15:19
Это зависит от нескольких факторов. Класс, определенныйClassLoader C1 может иметь ссылки на классы, которые разрешаются в типы времени выполнения, определенные другимClassLoader C2, если C1 делегирует связанные запросы на загрузку классов в C2. Это стандартное поведение, если C2 являетсяродитель погрузчик С1. Но это подразумевает, что эти классы в C2 остаются неизменными и что C2 остается достижимым и можетне будет мусора, когда C1 используется. Поэтому, если вы хотите изменить несколько связанных классов одновременно, все они должны быть переопределены в новом.ClassLoader

Ваш ответ на вопрос