Есть ли способ вернуть неосновной Java-класс в только что загруженное состояние? Мне нужен эквивалент выгрузки класса и его перезагрузки с нуля. В основном меня интересуют статические инициализаторы и переменные.
Контекст проблемы: я пишу робот-грейдер для студенческого кода. Одна распространенная ошибка студента, которую я видел, заключается в неправильном использовании статических переменных. Например, рассмотрим коллекцию со статическим количеством элементов, которые она содержит. Коллекция будет работать нормально при первом ее создании и использовании, но не будет работать при следующем создании экземпляра. Если я хочу, чтобы мои тесты были как можно более модульными, мне нужен способ восстановить чистое состояние после теста.
Прямо сейчас я загружаю Класс более или менее так, и набросал, как я хочу его использовать.
String classUnderTest = "package.class";
Class unitUnderTest;
try {
unitUnderTest = Class.forName(classUnderTest);
} catch (ClassNotFoundException e) {
System.out.println("Class \"" + classUnderTest + "\" was not found, can't continue.");
printGradeAndExit();
}
// Run foundation tests (stuff on which later tests depend) using unitUnderTest.newInstance()
runFoundationTests(unitUnderTest);
// Now reset unitUnderTest for a static variable detection test
lookForCommonStaticVariableMistakes(unitUnderTest);
Очевидно, что робот-грейдеры не могут быть идеальными, но я бы хотел уловить распространенные ошибки, и это одна из них.
В соответствии с спецификацией языка Java, раздел 12.7 , поддержка выгрузки классов является необязательной (но она будет делать именно то, что я хочу). Есть ли способ сделать это, не полагаясь на нестандартные функции?
Последним средством является сборка Ant, которая запускает серию тестов в отдельных программах, но я бы хотел сделать эту работу в одном процессе, если это возможно.