2017-05-03 1 views
0

자바 인터뷰에서 질문을 받았습니다. 부모 델리 게이션 모델 때문에 Java 클래스 로더는 클래스를 한 번만로드합니다. 그래서 내 대답은 그것을로드하는 사용자 정의 클래스 로더를 사용하는 것입니다. 그게 맞습니까? 이 질문에 대답하는 방법?JVM에서 클래스 로더를 사용하여 클래스를 두 번로드하는 방법은 무엇입니까?

+0

당신이 * 클래스를로드 의미합니까 * :

다음 코드 예제

는 접근 방식을 보여줍니다? – EJP

+0

@ EJP 예, 맞습니다 – flower

+0

두 개의 다른 클래스 로더를 사용합니다 –

답변

2

다릅니다. 정규화 된 이름이 java.으로 시작하는 클래스는 부트 스트랩 로더에 의해서만로드 될 수 있으므로 두 번째로로드되지 않습니다. 부트 스트랩 로더에 의해로드 된 다른 모든 클래스는 상위 위임 모델을 따르지 않는 사용자 정의 클래스 로더 구현으로 만로드 될 수 있습니다. 부트 스트랩 로더는 모든 로더의 부모입니다.

ClassLoader 인스턴스로로드 된 모든 클래스의 경우 상위 위임 모델을 따르는 표준 클래스 로더를 생성 할 수 있지만 해당 로더를 부모로 가질 수 없습니다. 물론 위임 모델을 따르지 않고 사용자 정의 로더를로드 할 수도 있습니다. 선택은 같은 로더에 의해 원래로드 된 해당 클래스가 참조하는 다른 클래스를 처리하려는 f}에 따라 다를 수 있습니다. 해당 환경의 전체 복사본을 만들거나 원래 로더로 로딩을 리디렉션하려고 시도 할 수 있습니다. 이렇게하면 역 참조가있을 때 문제가 발생합니다. 두 번

public class ReloadMySelf { 
    public static void main(String[] args) throws IOException, ClassNotFoundException { 
     final Class<?> o = ReloadMySelf.class; 
     URL loc = o.getProtectionDomain().getCodeSource().getLocation(); 
     ClassLoader parent = o.getClassLoader().getParent(); 
     try(URLClassLoader cl = new URLClassLoader(new URL[]{loc}, parent)) { 
      Class<?> duplicate = cl.loadClass(o.getName()); 
      System.out.println("original: "+o+" ("+o.getClassLoader()+')'); 
      System.out.println("duplicate: "+duplicate+" ("+duplicate.getClassLoader()+')'); 
     } 
    } 
} 
관련 문제