2011-10-28 6 views
2

특정 클래스가 시스템에 등록해야하는 레지스트리 클래스가있는 경우가 있습니다. API를 작성하기 때문에 런타임 전에 어떤 클래스인지 반드시 알 수는 없으므로 각 솔루션 내에서 정적 블록을 사용하여 자체 등록합니다.런타임에 클래스를 강제로드 할 수있는 방법이 있습니까?

문제는 물론 각 클래스가 초기화 될 때까지 정적 블록이 실행되지 않으며 각 클래스에 대한 명시 적 참조가 없으므로 초기화되지 않습니다. Catch-22.

그래서 클래스가 명시 적으로 참조하지 않고 시작시 초기화되는지 확인하는 방법이나 주석이 있습니까?

+0

클래스가 초기화되었는지 확인하기 위해'Class.forName ("com.example.MyClass")'를 호출 할 수 있습니까? 또한'class.forName' 메쏘드가 있습니다. 매개 변수로'initialize' 플래그를 사용합니다. –

+0

제가 말했듯이, 제 코드는 미리 클래스를 인식하지 못합니다. 명시 적으로 호출 할 수 있다면 문제가되지 않을 것입니다.) – mikek

+0

클래스 이름을 나열하기 위해 Java 속성 또는 구성 파일을 사용하여 직접로드 할 수 있습니까? *가 특정 Java Virtual Machine (JVM) *의 응용 프로그램에 대해 한 번 인스턴스화되도록 보장되는 새로운 종류의 세션 bean 인'@ Singleton' bean 주석을 사용할 수 있습니까? –

답변

1

예를 들어, 스프링은 @Component 주석을 사용하거나 런타임에 주석이 달린 클래스의 경우 서브 클래스가 scan 인 경우이를 수행합니다. 당신은 이것을 위해 봄을 사용하거나, 그러한 기능을 직접 구현하거나 scannotation과 같은 전용 라이브러리를 사용할 수 있습니다.

봄을 들여다 보려는 경우 bean ClassPathScanningCandidateComponentProvider 독립형을 사용하여 지정된 주석이있는 클래스를 검색 할 수 있습니다.

+0

좋은 생각이지만,이 경우 EJB3.0에 고정되어 있습니다. – mikek

1

컨테이너 환경 (예 : OSGI, Spring, Guice 등)을 사용하지 않는 경우 명시 적으로 지정하지 않아도 일반적인 방법은 없습니다. 특정 JDBC 드라이버 라이브러리 사용자가 사용하기 전에 드라이버가 초기화되었는지 확인해야하는 JDBC 접근 방식을 사용할 수 있습니다.

즉 누군가를 실행해야합니다. Class.forName("org.postgresql.Driver");, 이는 org.postgresql.Driver 클래스를로드합니다. 이 클래스에는 필요한 다른 모든 클래스를로드/등록하는 정적 이니셜 라이저가있을 수 있습니다.

+0

EJB3.0은 내가 보증 할 수있는 유일한 컨테이너입니다. 그러나 이러한 클래스는 EJB 컨텍스트에 명시 적으로 없습니다. – mikek

+1

servletcontextlistener를 계산하지 않으려면 EJB3에 초기화 프로그램 프레임 워크가 없습니다. – Renan

관련 문제