有沒有辦法將非核心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 Language Specification, Section 12.7,支持類的卸載是可選的(但會做我想要的)。有沒有辦法做到這一點,而不依賴於非標準的功能?
最後的手段是做一個Ant構建,它在單獨的程序中運行一系列測試,但如果可能的話,我想在一個過程中完成這項工作。
我沒有看到您發佈的代碼中使用靜態初始值設定項的任何內容,更不用說「重新運行」它們。 – Perception 2012-03-01 03:29:05
當unitUnderTest加載並調用newInstance()時,該類的靜態初始值設定項將運行。 – Mike 2012-03-01 03:31:02