2011-09-13 2 views
5

우리는 클래스 TestClass의 객체를 가진 캐시 (Map)를 가지고 있습니다. 코드가 ClassCastException을 던졌다 아래, 그래서 또 다른 클래스 로더는, 다시 런타임에로드 TestClass/초기화 :클래스 A가 클래스 A와 동일하지 않습니다.

TestClass obj1 = (TestClass)map.get("key"); // throws a ClassCastException 

ClassCastException when casting to the same class

좋아, 나는이 시점까지이 문제를 이해한다.

따라서 배경 정보가 왜 TestClass.class이 아닌지는 TestClass.class과 같지 않습니다. 다른 클래스 로더가 ReferenceType과 다른 ID를 설정했다고 가정합니다. 나에게 배경을 설명 할 수있는 사람은 누구입니까?

최저 페이지는 내가 발견했습니다 이 http://www.objectsource.com/j2eechapters/Ch21-ClassLoaders_and_J2EE.htm

답변

8

예, 올바른 방향으로 연구 포인트 : 다른 클래스 로더에 의해로드 된 동일한 클래스 정의가 JVM에 의해 두 가지 클래스로 볼 수 있습니다. 따라서 그들 사이에 캐스팅은 ClassCastException으로 실패합니다.

두 개의 고유 한 클래스 토큰 개체가 있기 때문에 차이가 있다고 생각합니다. 이것은 다른 로더에 의해로드 된 클래스가 사실 동일한 클래스의 다른 버전 일 수 있기 때문에 이와 같아야합니다. 모든 클래스의 클래스 토큰은 고유합니다 (즉, 동일한 클래스 로더 영역 내에서). JVM이 클래스 토큰을 물리적 평등 (==)이 아닌 다양한 속성으로 비교하기 시작하면 벌레가 생길 수 있습니다.

1

사용자가 경험 한 바에 따라 사용자 정의 클래스 로더가 존재하는 이유가 있습니다. 하나의 JVM에서 같은 이름의 다른 클래스를로드 할 수 있습니다. JVM에서 클래스의 ID는 클래스 이름과 클래스 로더로 구성된 튜플에 의해 제공됩니다. Java 언어에서 클래스는 완전한 이름으로 식별됩니다.

1

나에게 배경을 설명 할 수있는 사람은 누구입니까?

Péter Török는 이미 다른 클래스 로더에서로드 할 때 다른 것으로 간주됩니다. 배경은 응용 프로그램 서버가 다른 버전의 응용 프로그램을 지원할 수 있어야한다는 것입니다. 동일한 라이브러리의 서로 다른 버전이 귀 파일에 포함되어 있습니다.

1

수수께끼가 없습니다. 다음과 같은 유형의 런타임 평등은 Java 언어 사양에 정의되어 있습니다. 실행시

는 "같은 바이너리 명을 가지는 여러 기준 유형이 다른 클래스 로더에 의해 동시에로드 할 수있다 이러한 유형 또는 표시하지 않을 수 있습니다 같은 타입 선언. 비록 두 개의 타입이 같은 타입 선언을 나타내더라도 별개의 것으로 간주됩니다. "

JLS 4.3.4 - When reference types are the same. (두 번째 단락)

관련 문제