2016-12-13 8 views
9

에 의해 배열을 대체 할 수 있습니다. 문제는 콘솔에 [[Ljava.lang.Object이 표시 될 것으로 예상한다는 것입니다.클래스 로더는 아무것도

사실상, JVM specification에, 나는 다음을 읽을 수 있습니다 :

배열 클래스가 자바 가상 머신 (§5.3.3)에 의해 직접 작성됩니다

아닌 클래스 로더에 의해. 그러나 D의 정의 클래스 로더가 Object[][] 이후

가 배열 클래스 배열 클래스 C를 만드는 과정에서 사용되는, 내 findClass이 인수 [[Ljava.lang.Object에 있지만 요소 호출되지 않을 것으로 가정 java.lang.Object을 입력하십시오.

또한, 섹션 "어레이 클래스 만들기", 재귀 알고리즘은 실제로 설명되어

컴포넌트 타입이 사용 재귀인가 참조 형식이 부분 (§5.3)의 알고리즘이면

C.

의 구성 요소 유형을로드하여 만들기 위해 클래스 로더 L 그래서 제 질문은 다음과 같습니다

  • 이유는이 OUTP 무엇입니까 유? JVM이 나를 위해 그것을하는 대신 내 ClassLoader 안에이 재귀 알고리즘을 수동으로 포함시켜야한다는 뜻인가요? 이것이 이것이 의미하는 바라면, 그것을하는 가장 좋은 방법은 무엇입니까?
  • 첫 번째 인용문에서 "만든"단어를 잘못 해석합니까? 그것은 런타임 배열 클래스를 만들 수 없다는 의미 일 뿐이지 만 여전히로드를 패치 할 수 있습니까?
+1

OP의 요점은 스펙이 어레이 클래스의 경우 JVM이 클래스 로더 사용을 피하고 클래스를 직접로드한다는 것을 나타내는 것입니다. 그리고 이것은 매우 좋은 질문입니다. –

+0

예, 배열의 요소 유형을로드하기 위해 패치를 테스트했습니다. 하지만 대신 전체 배열을 대체합니다. – Codoscope

답변

4

당신은 JVM 사양에 대해 묻고 있지만 테스트는 인 독립적 인 클래스 java.lang.ClassLoader의 동작을 보여줍니다. JVM에서 배열 클래스를로드하는 경우 클래스 로더를 완전히 건너 뜁니다. 이 작업은 JVM을 수 있도록함으로써 입증 할 수있는 사용자 정의 클래스 로더 클래스를로드하려고 :

Class<?> clazz = Class.forName("[[Lcom.foo.Test;", true, new ClassLoader() { 
    @Override 
    public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { 
     System.out.println("Loading " + name); 
     return super.loadClass(name, resolve); 
    } 
}); 
System.out.println(clazz); 

출력 : 당신이 볼 수 있듯이

 
Loading com.foo.Test 
class [[Lcom.foo.Test; 

, 구성 요소 유형이 처음 클래스 로더를 통해로드 배열 형식은 암시 적으로로드됩니다.