2011-09-07 3 views
0


나는 클래스 로더 문제로 실행했습니다, 그리고는 다음과 같이 간다 :이 일이 일어날 수 있는지 몰랐다 처음ClassDefiner는 언제 사용됩니까?

java.lang.ClassCastException: com.google.appengine.api.datastore.Key 
cannot be cast to com.google.appengine.api.datastore.Key 

을하지만, 일부 검색 후 나는 ClassCastException도 던져 질 수 있다는 것을 배웠습니다 같은 클래스가 2 개의 다른로드 된 경우 ClassLoader. 나는 주위를 파고 계속이 발견 :

[JVM_DefineClass에서로드 com.google.appengine.api.datastore.Key]
...
[로드 com.google.appengine.api.datastore.Key을 파일 : /home/alex/java/eclipse/plugins/com.google.appengine.eclipse.sdkbundle_1.5.1.r36v201106211634/appengine-java-sdk-1.5.1/lib/user/appengine-api-1.0-sdk- 1.5.1.jar]

실제로 이것은 Key이 실제로 2 가지 다른 ClassLoader에로드된다는 증거입니다. 그러나 조사를 계속하는 방법을 모릅니다. 새로운 ClassLoaderClassDefiner (http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Modules-sun/reflect/sun/reflect/ClassDefiner.java.htm 참조)을 통해 인스턴스화되었지만 그 이유는 알 수 없습니다. 나는 몇 가지 해답을 찾아 봤지만 아무것도 발견하지 못했다.

기본 테스트에서 을 @BeforeClass으로 설정한다는 것과 관련이 있습니까? 그러나 그것이 사실이라면 (JVM_DefineClass를 받아 들일 수 있습니다), 두 번째 것은 무엇입니까 ClassLoader?

희망 사항은 여기에서 대답을 찾으십시오. Alex.

답변

0

나는 당신의 문제를 아주 잘 파악하고 있지는 않지만, 아무도 대답을하지 못하기 때문에 나는 그것에 대해 이야기 할 것이다. 첫째, ClassDefiner는이 작업과 어떤 관련이 있습니까? 어딘가에 사용하고 있습니까? ClassDefiner가 새로운 ClassLoader를 작성해도, 지정된 ClassLoader를 새로운 ClassLoader의 부모로서 사용해, 디폴트의 ClassLoader 동작은, 그 자체를로드하기 전에 친 ClassLoader 내의 클래스를 검색하는 것이므로, 이것에 의해 "클래스 설명하는 두 개의 ClassLoaders "문제로로드됩니다.

@BeforeClass에 다른 ClassLoader를 설정한다는 것은 무엇을 의미합니까? 어떤 ClassLoader에 클래스를로드하고, 클래스의 클래스 또는 인스턴스를 어딘가에 유지 한 다음 ClassLoader를 임의로 전환하면 확실히 이런 문제가 발생할 수 있습니다.

그 중 하나가 도움이됩니까? 자신이 작성한 코드를보고있을 때 Java 코어 클래스에서 버그를 찾고 있다고 생각합니다. 확립 된 라이브러리에 버그가 있다고 항상주의하십시오.

+0

안녕하세요, Ryan, 저는 jdk에서 버그를 찾지 않고 대신 내 설정을 수정하려고합니다. - 지난 며칠 동안 나를 미치게 만들었습니다. 나는 짧게하려고 노력할 것이다 - –

+0

http://pastebin.com/GVdzMdQX. 나는 그것들을 조사 할 것이고,'Key' 클래스가 두 번로드된다는 것이 분명하다. 그리고 나는 정말로 내 코드에서 뭔가 잘못되었다고 확신한다;) –

관련 문제