Class.forName () 대 ClassLoader.loadClass ()-동적 로딩에 사용할 것은 무엇입니까? [복제]
이 질문에 이미 답변이 있습니다.
클래스를 동적으로로드 할 때 사용하는 것이 적절한시기
Class.forName("SomeClass");
그리고 언제 사용해야합니까
ClassLoader.getSystemClassLoader().loadClass("SomeClass");
아니면 두 가지 방법으로 동일한 작업을 수행합니까?
그들은 아주 다릅니다!
에 대한 설명서에 명시된대로 Class.forName(String)
,
주어진 문자열 이름을 가진 클래스 또는 인터페이스와 관련된 Class 객체를 반환합니다. 이 메서드를 호출하는 것은 다음과 같습니다.
Class.forName(className, true, currentLoader)
( true
여기서는 클래스를 초기화 하시겠습니까? )
반면에 ClassLoader.loadClass(String)
:
이 메서드를 호출하는 것은을 호출하는 것과 같습니다
loadClass(name, false)
.
(여기서 부울은 초기화와 관련이 없습니다.하지만 loadClass (String, boolean) 문서를 확인하면 클래스를 초기화하는 것이 아니라로드하는 것이 전부임을 알 수 있습니다).
첫 번째 항목 ( Class.forName("SomeClass");
)은 다음을 수행합니다.
- 이 코드를 호출하는 클래스를로드 한 클래스 로더를 사용하십시오.
- 클래스 초기화 (즉, 모든 정적 초기화 프로그램이 실행 됨)
다른 ( ClassLoader.getSystemClassLoader().loadClass("SomeClass");
)은 다음을 수행합니다.
- "시스템"클래스 로더 사용 ( 재정의 가능 )
- 클래스를 초기화하지 마십시오 (예 : JDBC 드라이버를로드하는 데 사용하면 등록되지 않고 JDBC를 사용할 수 없습니다!).
Tomcat과 같은 컨테이너에서 실행될 웹 애플리케이션을 코딩한다고 가정합니다. Tomcat이하는 일은 각 웹 응용 프로그램에 대한 클래스 로더를 만드는 것입니다 (나중에 웹 응용 프로그램을 언로드하고 메모리를 해제 할 수 있도록이 작업을 수행하려면 전용 클래스 로더가 필요합니다!). 이 상황에서 두 호출 모두 상당히 다른 결과가 생성된다는 것을 알 수 있습니다!
클래스 로딩 및 초기화에 대한 더 자세한 (그리고 권위있는) 정보 는 Java 언어 사양의 최신 (3rd) 에디션의 섹션 12.2 및 12.4 를 확인하십시오 .
Class.forName()
호출자의 클래스 로더를 사용하고 클래스를 초기화합니다 (정적 초기화 프로그램 실행 등).
loadClass
A는 ClassLoader
방법, 그래서 명시 적으로 제공하는 로더를 사용하고 (처음 사용)로 지연 클래스를 초기화한다.
또한를 사용 하는 Class.forName () 이 있습니다 ClassLoader
.
그들은 기본적으로 같은 일을하고 있습니다. 사용되는 ClassLoader는 다를 수 있습니다. Class.forName은 this.getClass (). getClassLoader ()에서 얻은 ClassLoader를 사용하는 반면 다른 코드는 시스템 클래스 로더를 사용하도록 지정합니다.
대부분의 응용 프로그램에서 이것은 동일한 클래스 로더이지만 J2EE 응용 프로그램이나 애플릿과 같은 더 복잡한 환경에서는 그렇지 않을 수 있습니다.
ClassLoader는 추상 클래스이지만 응용 프로그램은 항상 클래스 로더에 의해로드되며 네트워크 클래스 로더 또는 기타 소스와 같은 사용자 정의 클래스 로더가있을 수 있습니다.
반면에 클래스 자체는 클래스와 인터페이스를 나타내며 클래스 클래스에는 애플리케이션이 기본적으로 실행되는 현재 클래스 로더를 사용하여 클래스를로드하는 forName 함수가 있습니다.
다음은 호출하는 클래스 로더를 호출하는 Class.forName의 소스입니다.
public static Class<?> forName(String className)
throws ClassNotFoundException {
return forName0(className, true, ClassLoader.getCallerClassLoader());
}
http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/ClassLoader.html
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html#forName(java.lang.String )
힌트 : 원시 클래스 로더 http://docs.oracle.com/javase/1.4.2/docs/guide/security/spec/security-spec.doc5.html
Class.forName()
클래스를로드하고 초기화합니다. 클래스 로더 하위 시스템에서는로드, 링크 및 초기화 단계의 세 단계를 모두 실행합니다.ClassLoader.loadClass()
동작은 클래스가 처음 사용될 때까지 초기화를 지연시킵니다. 클래스 로더 하위 시스템에서는로드 및 링크 단계의 두 단계 만 실행합니다.
예를 들면 :
class MyClass {
static {
System.out.println("static block in MyClass");
}
}
public class TestCase1 {
public static void main(String... args) throws Throwable {
Class.forName("A");
}
} //The above TestCase1 produce output: static block in MyClass
public class TestCase2 {
public static void main(String... args) throws Throwable {
ClassLoader.getSystemClassLoader().loadClass("MyClass");
}
} //The above TestCase2 not produce any output
나는 자바에서 클래스 로딩을 좋아합니다 ...
실제로 응용 프로그램이 실행되는 컨텍스트에 따라 다릅니다. 명령 줄 프로그램이 아닌 웹 컨텍스트에서 사용하면 다른 결과를 얻을 수 있습니다.
또한 ClassPath의 모양과 예상했던 작업에 따라 문제가 발생했습니다.
이 JavaWorld 기사는 이에 대한 좋은 거래를 설명합니다.
'Programming' 카테고리의 다른 글
해시를 위해 소금을 숨길 필요성 (0) | 2020.08.23 |
---|---|
CSS : 특정 요소에 콘텐츠를 추가하지 않은 후 (0) | 2020.08.23 |
Git pull 결과 커밋 로그에 불필요한 "Merge branch"메시지가 나타납니다. (0) | 2020.08.23 |
배경 위치를 제외한 모든 속성에 CSS3 전환을 어떻게 적용합니까? (0) | 2020.08.23 |
혼란을 줄이는 것 외에 사용하지 않는 가져 오기를 Java에서 정리해야하는 이유가 있습니까? (0) | 2020.08.23 |