非コアJavaクラスを新しくロードされた状態に戻す方法はありますか?クラスをアンロードして最初からリロードするのと同じことをしたいと思います。私は主に静的初期化子と変数に関心があります。
問題のコンテキスト:学生コード用のロボグレーダーを書いています。私が見た一般的な学生のエラーの1つは、静的変数を不適切に使用することです。たとえば、含まれる要素の静的カウントを持つコレクションについて考えてみます。コレクションは、最初に作成して使用したときに正常に機能しますが、次のインスタンス化では失敗します。テストを可能な限りモジュール化する場合は、テスト後にクリーンな状態を復元する方法が必要です。
今、私は多かれ少なかれこのようにクラスをロードしています、そして私はそれをどのように使いたいかをスケッチしました。
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);
もちろん、ロボグレーダーは完璧ではありませんが、よくあるエラーをキャッチしたいと思います。これもその1つです。
Java言語仕様のセクション12.7によると、クラスのアンロードのサポートはオプションです(ただし、私が望むことを正確に実行します)。非標準機能に依存せずにこれを行う方法はありますか?
最後の手段は、別々のプログラムで一連のテストを実行するAntビルドを実行することですが、可能であれば、これを1つのプロセスで機能させたいと思います。