문제

나는 "Class.getClassLoader()가 특정 클래스를 로드하는 데 사용되는 ClassLoader를 반환합니다"라는 내용을 여러 곳에서 보았으므로 다음 예제의 결과에 당황했습니다.


package test;

import java.lang.*;

public class ClassLoaders { 
    public static void main(String[] args) throws java.lang.ClassNotFoundException{
      MyClassLoader mcl = new MyClassLoader();
      Class clazz = mcl.loadClass("test.FooBar");
      System.out.println(clazz.getClassLoader() == mcl); // prints false
      System.out.println(clazz.getClassLoader()); // prints e.g. sun.misc.Launcher$AppClassLoader@553f5d07
    }
}

class FooBar { }

class MyClassLoader extends ClassLoader { }

clazz.getClassLoader() == mcl 문이 true를 반환하면 안 되나요?누군가 내가 여기서 놓친 것을 설명할 수 있습니까?

감사해요.

도움이 되었습니까?

해결책

자신만의 클래스로더를 생성할 때마다 클래스로더의 트리형 계층 구조에 연결됩니다.클래스를 로드하기 위해 클래스 로더는 먼저 로드를 상위 클래스에 위임합니다.모든 부모가 클래스를 찾지 못한 경우에만 처음 클래스를 로드하라는 요청을 받은 로더가 해당 클래스를 로드하려고 시도합니다.

특정 경우에는 로딩이 상위 클래스 로더에 위임됩니다.MyClassLoader에게 로드를 요청하더라도 로드를 수행하는 것은 부모입니다.이 경우 AppClassLoader입니다.

다른 팁

인용 클래스 로더의 API 문서:

클래스 로더의 각 인스턴스에는 관련 상위 클래스 로더가 있습니다. 클래스 또는 리소스를 찾도록 요청하면 클래스 로더 인스턴스는 클래스 또는 리소스 자체를 찾기 전에 클래스 또는 리소스 검색을 부모 클래스 로더로 위임합니다.

자체 정의 된 클래스 로더가 클래스를로드하는 VM의 클래스 로더로 호출을 위임 한 경우. Clazz.getClassLoader ()는이 클래스 로더를 반환합니다.

세부 사항을 얻으려면 : 수업의 Javadoc 클래스 로더 실행 된 단계의 순서에 대한 다음 설명을 제공합니다.

지정된 이진 이름으로 클래스를로드합니다. 이 메소드의 기본 구현은 다음 순서로 클래스를 검색합니다.

  1. FindLoadedClass (String)를 호출하여 클래스가 이미로드되었는지 확인하십시오.
  2. 부모 클래스 로더에서로드 클래스 메소드를 호출하십시오. 부모가 NULL이면 가상 머신에 내장 된 클래스 로더가 사용됩니다.
  3. FindClass (String) 메소드를 호출하여 클래스를 찾으십시오.

방법을 변경하지 않고 상속 받으면이 동작은 변경되지 않습니다. 2 단계는 클래스가로드되는 곳입니다. ClassLoader의 매개 변수가없는 생성자 (MyClassLoader에서 생성자를 자동으로 정의하지 않았기 때문에)를 자동으로 내장형 클래스 로더를 사용합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top