2017-11-16 9 views
2

Java의 ClassLoader는 Java로 클래스 파일을로드하는 데 사용되는 클래스입니다.java의 classloader는 클래스 자체이며 클래스 로더 클래스를로드 할 사람은 누구입니까?

은 java.lang.ClassLoader의이 추상 클래스를 여기

내 질문은이 java.lang.ClassLoader의 클래스는 JVM의 클래스 로더 (1. 부트 스트랩 클래스 로더 2. 확장 클래스 로더 3에 관련된 모든 방법입니다 않습니다. 시스템 클래스 로더)?

또는이 java.lang.ClassLoader는 사용자 정의 클래스 로더를 만드는 데 사용할 수있는 별도의 클래스입니까?

클래스 로더는 Java 클래스를 Java 가상 시스템에 동적으로로드하는 Java Runtime Environment의 일부입니다. JVM은 세 개의 클래스 로더가

  1. 부트 스트랩 클래스 로더

  2. 확장 클래스 로더

  3. 을 사용하는 시작되면이 라이브러리에 포함 된 클래스, 라이브러리의 위치가 내용을 읽고로드에 대한 책임 시스템 클래스 로더

부트 스트랩 클래스 로더가 코어 Java 라이브러리를로드합니다. 그것은 원시 코드로 작성됩니다. 부트 스트랩 클래스 로더는 java.lang.Object와 같은 주요 자바 클래스와 다른 런타임 코드를 메모리에 로딩합니다. 런타임 클래스는 jre/lib/rt.jar 파일에 패키지화되어 있습니다.

확장 클래스 로더는 확장 디렉토리에 코드를로드합니다. ExtClassLoader 클래스에 의해 구현됩니다.

시스템 클래스 로더는 시스템 클래스 경로 변수에 매핑되는 java.class.path에있는 코드입니다. AppClassLoader 클래스에 의해 구현됩니다. 기본적으로 모든 사용자 클래스는 시스템 클래스 로더에 의해로드됩니다.

Java ClassLoader는 계층 적이며 클래스를로드하기 위해 요청이 제기 될 때마다 클래스를 부모에게 위임하므로 런타임 환경에서 고유성이 유지됩니다. 친 클래스 로더가 클래스를 찾지 않으면 클래스 로더 자체가 클래스를로드하려고 시도합니다. System 클래스 다음 발견되지 않는 경우는 다음 확장 클래스 로더가 클래스를 검색합니다 발견되지 않는 경우는

은 그래서 먼저 시스템 클래스 로더가 클래스를 검색합니다 여기에 클래스 로더를 부트 스트랩 요청을 위임합니다 확장 클래스 로더에 요청을 위임 의미 로더가 클래스를 검색하지 않으면 클래스가 검색됩니다. ClassNotFoundException

JVM은 항상 클래스를로드하기위한 시스템 클래스 로더로 시작합니까?

내가 틀렸다면 정정 해줘 어떤

답변

2

용어 "시스템 클래스 로더는"잘못된 이름입니다. 올바르게 말한대로 클래스 경로의 위치에서 클래스를로드하는 것은 응용 프로그램 클래스입니다. 자바 8 모두 AppClassLoaderExtClassLoader의로서는

java.lang.ClassLoader의 서브 java.security.SecureClassLoader의 서브 클래스이다 java.net.URLClassLoader의 서브 클래스이다.이러한 모든 클래스는 부트 스트랩 로더에 의해로드되어 닭고기 및 달걀 문제를 해결합니다.

각 런타임 클래스는 클래스 로더을 정의합니다. 시동 중에 부트 스트랩 로더에 의해 정의 된 클래스의 경우, 클래스 로더를 정의하는 것이 부트 스트랩 로더입니다. JVM 초기화가 완료되고 응용 프로그램을 시작하려고하면 Application 클래스 로더 (System 클래스 로더라고도 함)가 기본 클래스에 대해 쿼리됩니다. Application 클래스 로더는 먼저 상위 클래스를 쿼리하는 표준 위임 모델을 따르며 Extension 클래스 로더와 마찬가지로 클래스를 만드는 클래스 로더가 클래스 정의 클래스 로더가 될 것입니다.

이제 다른 클래스에서 참조하는 클래스를 해결하거나 Class.forName(String)이 호출 될 때 참조를 포함하는 클래스의 정의 로더가 클래스를 해결하는 데 사용됩니다. 따라서 Application 클래스 로더가 클래스 myapp.foo.Bar을로드하고 javax.swing.JButton에 대한 참조를 포함하면 정의 클래스 로더 인 Application 클래스 로더가 해당 클래스에 대해 쿼리되고 위임 모델을 따라 javax.swing.JButton으로 정의됩니다. 부트 스트랩 로더. 따라서 javax.swing.JButton 내의 클래스 참조는 부트 스트랩 로더를 통해서만 해결됩니다. 이는 javax.swing.JButton이 범위에 없기 때문에 myapp.foo.Bar 클래스에 대한 참조를 포함 할 수 없음을 의미합니다.

그래서, JVM은하지 항상 클래스를로드하기위한 "시스템 클래스 로더"로 시작하지만, 만 (또는 아이 로더) 또는에 의해 정의 된 클래스의 클래스 참조를 해결하기위한처럼 명시 적으로 조회되는 경우 수행 주 수업을 해결할 때.

는 될 것, 관계없이 위임하는 로더, 각 클래스 (getClassLoader()에 의해 반환되는)에 대한 정의 로더가있을 것입니다 방법 및이 엄격하게 부모 위임 모델을 따르지 않고 제 3 자 클래스 로더 있지만, 클래스 내의 참조를 해결하기 위해서 사용됩니다. JVM은 특정 클래스 로더가 룩업을 구현하는 방법에 관계없이 한 클래스 내의 동일한 심볼 이름이 항상 동일한 런타임 클래스로 확인되도록합니다.

Java 9에서는 Extension 클래스 로더가 Platform 클래스 로더로 대체되었습니다. 이 클래스 로더는 단순한 상위 위임에서 벗어날 수 있습니다. 즉 플랫폼 제공 모듈을 대체하는 응용 프로그램 제공 모듈을로드하기 위해 Application 클래스 로더에 위임 할 수 있습니다. 또한 내장 클래스 로더는 더 이상 URLClassLoader의 서브 클래스가 아닙니다.