有没有办法将非核心 Java 类返回到新加载的状态?我想要相当于卸载一个类并从头开始重新加载它。我最关心的是静态初始化器和变量。
问题背景:我正在为学生代码编写一个机器人评分器。我见过的一个常见的学生错误是不恰当地使用静态变量。例如,考虑一个包含静态元素计数的 Collection。该集合在第一次创建和使用时会正常工作,但在下一次实例化时会失败。如果我希望我的测试尽可能模块化,我需要一种在测试后恢复干净状态的方法。
现在我或多或少地像这样加载这个类,我已经勾勒出我想如何使用它。
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);
显然,robo-graders 不可能是完美的,但我想找出常见的错误,这就是其中之一。
根据Java 语言规范第 12.7 节,支持卸载类是可选的(但会做我想要的)。有没有办法在不依赖非标准功能的情况下做到这一点?
最后的手段是做一个 Ant 构建,它在单独的程序中运行一系列测试,但如果可能的话,我想在一个进程中完成这项工作。