일단 클래스가로드되면 static initializers를 다시 호출 할 수있는 방법이 있습니까?static initializer를 다시 호출
public class Foo {
static {
System.out.println("bar");
}
}
편집 :
은 내가 원래 클래스와 내가 정적 초기화에 구현되어 호출하는 데 필요한 논리를 작성하지 않았기 때문에 정적 초기화를 호출해야합니다.
일단 클래스가로드되면 static initializers를 다시 호출 할 수있는 방법이 있습니까?static initializer를 다시 호출
public class Foo {
static {
System.out.println("bar");
}
}
편집 :
은 내가 원래 클래스와 내가 정적 초기화에 구현되어 호출하는 데 필요한 논리를 작성하지 않았기 때문에 정적 초기화를 호출해야합니다.
논리가 여러 번 실행되는 한 가지 상황은 클래스가 다른 ClassLoader에 의해 여러 번로드되는 경우입니다. 이 예에서는 본질적으로 다른 클래스입니다.
일반적으로 이들은 단발 거래입니다. 논리를 여러 번 호출 할 수있게하려면 다른 사람들이 제안한대로 정적 메소드에 넣으십시오.
초기화 코드를 별도의 공용 정적 메서드에 넣으십시오. 정적 초기화 도구 및 다른 위치에서 초기화 코드를 호출 할 수 있습니까?
코드를 수정할 수 없습니다. 그것은 제 3 자 라이브러리에 있고 나는 정규 정적 메서드에서 코드로 자신의 배포판을 만들려하지 않습니다. :) 내가 사용한 솔루션은 일반 정적 메서드가 될 수 있도록 다른 클래스의 코드를 복사하여 붙여 넣는 것입니다. 그러나 나는 그것을 좋아하지 않았다.DRY – Kalecser
흠 ... 그럼 내 다음 질문은 왜 제 3 자 클래스가 정적 이니셜 라이저에 로직을 가지고있어서 다시 호출 할 수 있겠습니까?! –
정적 초기화 프로그램에서 XML 구성 파일을로드하고 처리합니다. XML을 다시로드하려고합니다. – Kalecser
나는 Earwicker의 대답에 동의합니다. 정적 초기화를 별도의 정적 메서드로 추출하면됩니다.
public class Foo {
static {
Foo.initialize();
}
public static void initialize() {
System.out.println("bar");
}
}
왜 downvote? 왜 나를 얕보는 사람이 그 이유를 설명 할 수 있습니까? –
정적 코드가 포함 된 클래스를 확장 한 다음 자신의 정적 초기화 프로그램을 넣을 수 있습니다. 작동 여부는 확실하지 않지만 :
public class OldBadLibraryClass {
static {
System.out.println("oldBadLibrary static init");
}
}
//next file
public class MyBetterClass extends OldBadLibraryClass {
static {
System.out.println("MyBetterClass init");
}
}
public class Test {
public static void main(String[] args) {
new MyBetterClass();
}
}
위의 내용이 원하는 순서대로 인쇄되는지 확인하십시오. 내 컴퓨터에서 작동했습니다.
이것은 완전히 해킹 된 것이기는하지만 아주 부서지기 쉽습니다. 재정의 할 수있는 init() 메소드를 갖도록 이전 클래스를 수정하는 것이 훨씬 더 낫습니다.
정확한 질문에 대한 정확한 답변을 원할 경우 대답은 '아니오'입니다. 리플렉션을 통해 정적 이니셜 라이저 또는 instanceInitializer를 호출 할 수 없습니다.
워드 프로세서는 분명히 말한다 :
getDeclaredMethod(String name)
을 위해 : 이름이 "< 초기화 >"또는 "<clinit>"인 경우
의 경우, NoSuchMethodException가 발생합니다.
getDeclaredMethods()
위한
:
클래스 초기화 메소드 리턴 어레이에 포함되지 않는다.
아니요. 리플렉션을 통해조차도 호출 할 수 없습니다.
여기 https://stackoverflow.com/a/19302726/2300018은 단위 테스트를 위해 정적 초기화 프로그램을 다시 실행하기 위해 유틸리티 클래스를 다시로드하는 저의 게시물입니다.
클래스 로더에 대한 참조를 찾으려고했지만 좋은 것을 찾을 수 없었습니다. 너 하나있어? –
아아, 아니. 내 지식은 VM 스펙, javadoc, 서버 매뉴얼 및 다양한 인터넷 소스에서 함께 자갈을 긋는다. "developerWorks"및 "ClassLoader"라고하는 것보다 더 나쁠 수 있습니다. – McDowell