Как узнать, была ли выполнена инициализация статического блока?
Я пытаюсь избавиться от некоторых утечек памяти. Я хотел бы сбросить все статические переменные всех классов (не только моих) из загрузчика классов. E сть classes
атрибут, который перечисляет все классы, известные ClassLoader.
Поэтому я просто хочу зациклить его и с помощью отражения установить статические переменные в нуль.
Проблема в том, что все эти классы не обязательно были инициализированы (инициализация статического блока не выполнялась). Поскольку целью является сброс значений и выгрузка классов, нет смысла инициализировать эти классы. Более того, когда я сбрасываю класс ROOT, который используется в SBI другого класса CHILD, запуск SBI в CHILD может привести к неожиданному поведению...
Таким образом, вопрос: есть ли способ узнать, был ли SBI запущен JVM или нет.
Замечания:
любому, кто предлагает использовать findLoadedClass класса ClassLoader, в спецификации есть это важное предложение: * В этом посте есть важное примечание: "загружен" не означает "инициализирован". инициализация происходит только в точные моменты, определенные JLS3 $12.4.1 *
1 ответ
static
Блок был инициализирован, если класс был загружен в JVM.
Загружен ли класс в JVM, который вы можете обнаружить с помощью ClassLoader