2011-03-21 4 views
5

내가 this 기사를 읽고 된 여러 클래스 로더를 통해 얻은, 그리고 그것을 말한다 :클래스의 인스턴스는

우리는 이러한 CustomClassLoaders에 의해로드 된 학생 클래스의 두 인스턴스가있는 경우가 student1 및 student2, 다음 student1 및 student2이없는 말 유형 호환 가능. 즉,

학생 student3 = (학생) student2;

은 ClassCastException을 던질 것입니다. 왜냐하면 JVM은 다른 ClassLoader 인스턴스에 의해 정의되기 때문에 JVM이이 두 클래스를 별개의 고유 한 클래스 유형으로 간주하기 때문입니다.

이제 전달하고자하는 내용을 이해했습니다. 즉, 두 개의 다른 클래스 로더를 사용하여 동일한 클래스를로드하면 형식이 호환되지 않습니다. 이렇게 멀리까지 좋습니다.

하지만 사용 한 예는

학생 student3 = (학생) student2 즉, 나를 혼란 것입니다; 우리는이 Studnet가 패키지 준수 적절한 위치에 존재한다는 것입니다 찾습니다 모든 것을 컴파일러, 학생학생 같은 refrance 변수를 선언 할 때

그것은 것이 아닌가 structure.Now 런타임에 우리는이 참조 변수를 실제로드 된 클래스에 할당 할 때 클래스를로드하는 데 어떤 클래스 로더가 사용되는지 정말로 중요합니까? 내 이해에서 클래스 로더는 우리가 ' new '를 호출하거나 정적 필드를 호출합니다. 단순히 유형을 선언 할 때가 아닙니다.

이 점에 대해 명확히하고이 점에 대해 제 이해를 돕습니다.

감사합니다, 대부분 정확하지만, 할당이 발생하면 JVM이 올바른지 확인해야 Mawia

답변

3

. 그러면 다음을 확인합니다. 왼쪽 (LHS)에 오른쪽 (RHS)을 지정할 수 있습니까?

규칙에 따르면 RHS의 런타임 유형을 LHS 유형으로 다운 캐스팅 할 수있는 경우 허용됩니다.

그래서 컴파일 타임에 위의 코드는 정상적으로 보입니다. 그러나 런타임에 isAssignableFrom() 호출은 두 유형이 다르므로 false를 반환합니다.

있어서 equals() 클래스 로더가 동일한 경우 정식 이름과 동일 를 반환하는 경우 trueClass인치 그래서이 경우 ClassCastException이 표시됩니다.

사용 된 방법은 기본 코드로 구현되므로 어떤 현상이 발생하는지 볼 수 없습니다. 그러나 isInstance()isAssignableFrom() 메서드는 두 클래스의 클래스 로더가 같을 때만 true를 반환합니다.

+0

하지만 jvm은 두 가지가 서로 다르다고 생각하게 만들었습니다. 이제는 클래스 로더가 student3과 연결되지 않습니다. Student2만이 일부 클래스 로더에 의해로드 된 오브젝트에 지정됩니다. – mawia

+0

@mawia : 예, 있습니다 : 확인하려면 JVM이'student3' 클래스를로드해야합니다. 따라서 변수 할당에 대해서도 클래스 로딩이 발생한다고 말할 수 있습니다. 또는 당신이'Class.forName()'을 부를 때. –

1

예, 런타임에 클래스 로더가 어떤 클래스를로드했는지가 중요합니다. 클래스 로더는 클래스가로드 될 때마다 검사됩니다. new 또는 정적 필드를 만났을 때뿐만 아니라.클래스 이름이 Java 코드에 나타날 때마다 또는 더 정확하게는 클래스 이름이 바이트 코드에서 참조되고 바이트 코드가 실행될 때마다 발생합니다.

관련 문제