비 핵심 Java 클래스를 새로로드 된 상태로 되돌릴 수있는 방법이 있습니까? 클래스를 언로드하고 처음부터 다시로드하는 것과 동일한 작업을 원합니다. 나는 주로 static initializers와 변수에 관심이있다.클래스 정적 초기화 프로그램을 다시 실행하는 방법을 찾고
문제 상황 : 나는 학생 코드에 대해 로보 그레이더를 작성하고 있습니다. 제가 보았던 한 가지 일반적인 학생 오류는 정적 변수를 부적절하게 사용하는 것입니다. 예를 들어 정적 요소가 포함 된 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);
명백하게 로보 그레이더는 완벽 할 수는 없지만 일반적인 오류를 잡아 내고 싶습니다.
Java Language Specification, Section 12.7에 따르면 수업을 지원하는 것은 선택 사항이지만 원하는대로 할 수 있습니다. 비표준 기능에 의존하지 않고이를 수행 할 수있는 방법이 있습니까?
마지막 수단은 별도의 프로그램에서 일련의 테스트를 실행하는 Ant 빌드를 수행하는 것이지만 가능한 한 단일 프로세스로이 작업을하고 싶습니다.
정적 초기화 프로그램을 사용하여 게시 한 코드에는 아무 것도 보이지 않지만 훨씬 덜 '다시 실행'합니다. – Perception
unitUnderTest가로드되고 newInstance()가 호출되면 클래스의 정적 초기화자가 실행됩니다. – Mike