2009-03-25 3 views
5

일단 클래스가로드되면 static initializers를 다시 호출 할 수있는 방법이 있습니까?static initializer를 다시 호출

public class Foo { 

    static { 
     System.out.println("bar"); 
    } 

} 

편집 :

은 내가 원래 클래스와 내가 정적 초기화에 구현되어 호출하는 데 필요한 논리를 작성하지 않았기 때문에 정적 초기화를 호출해야합니다.

답변

4

논리가 여러 번 실행되는 한 가지 상황은 클래스가 다른 ClassLoader에 의해 여러 번로드되는 경우입니다. 이 예에서는 본질적으로 다른 클래스입니다.

일반적으로 이들은 단발 거래입니다. 논리를 여러 번 호출 할 수있게하려면 다른 사람들이 제안한대로 정적 메소드에 넣으십시오.

+0

클래스 로더에 대한 참조를 찾으려고했지만 좋은 것을 찾을 수 없었습니다. 너 하나있어? –

+0

아아, 아니. 내 지식은 VM 스펙, javadoc, 서버 매뉴얼 및 다양한 인터넷 소스에서 함께 자갈을 긋는다. "developerWorks"및 "ClassLoader"라고하는 것보다 더 나쁠 수 있습니다. – McDowell

10

초기화 코드를 별도의 공용 정적 메서드에 넣으십시오. 정적 초기화 도구 및 다른 위치에서 초기화 코드를 호출 할 수 있습니까?

+0

코드를 수정할 수 없습니다. 그것은 제 3 자 라이브러리에 있고 나는 정규 정적 메서드에서 코드로 자신의 배포판을 만들려하지 않습니다. :) 내가 사용한 솔루션은 일반 정적 메서드가 될 수 있도록 다른 클래스의 코드를 복사하여 붙여 넣는 것입니다. 그러나 나는 그것을 좋아하지 않았다.DRY – Kalecser

+0

흠 ... 그럼 내 다음 질문은 왜 제 3 자 클래스가 정적 이니셜 라이저에 로직을 가지고있어서 다시 호출 할 수 있겠습니까?! –

+0

정적 초기화 프로그램에서 XML 구성 파일을로드하고 처리합니다. XML을 다시로드하려고합니다. – Kalecser

4

나는 Earwicker의 대답에 동의합니다. 정적 초기화를 별도의 정적 메서드로 추출하면됩니다.

public class Foo { 

    static { 
     Foo.initialize(); 
    } 

    public static void initialize() { 
     System.out.println("bar"); 
    } 

} 
+0

왜 downvote? 왜 나를 얕보는 사람이 그 이유를 설명 할 수 있습니까? –

0

정적 코드가 포함 된 클래스를 확장 한 다음 자신의 정적 초기화 프로그램을 넣을 수 있습니다. 작동 여부는 확실하지 않지만 :

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() 메소드를 갖도록 이전 클래스를 수정하는 것이 훨씬 더 낫습니다.

0

정확한 질문에 대한 정확한 답변을 원할 경우 대답은 '아니오'입니다. 리플렉션을 통해 정적 이니셜 라이저 또는 instanceInitializer를 호출 할 수 없습니다.

워드 프로세서는 분명히 말한다 :

getDeclaredMethod(String name)을 위해 : 이름이 "< 초기화 >"또는 "<clinit>"인 경우

의 경우, NoSuchMethodException가 발생합니다. getDeclaredMethods()위한

:

클래스 초기화 메소드 리턴 어레이에 포함되지 않는다.

아니요. 리플렉션을 통해조차도 호출 할 수 없습니다.