2012-03-03 2 views
0

참고 : 저는 프로그래밍에 익숙하지 않습니다. 잘못된 용어 사용에 신경 쓰지 않기를 바랍니다. :-)클래스를 원격으로로드 할 때 IllegalAccessError가 발생하는 이유는 무엇입니까?

클래스를 원격으로로드하려고합니다. 클래스가 다운로드되고 올바르게 시작된 것 같지만 메서드 중 하나를 호출 할 때 IllegalAccessError가 발생합니다. 여기 내가 로컬에서하는 일이 있는데, 이것은 오류없이 100 % 작동합니다.

(Parent) instance = (Parent)Class.forName("somepackage.ChildClass").newInstance(); 
instance.callSomeMethod(); 

다음은 원격으로로드하는 방법입니다. 이것은 "클래스 ChildClass에에서 필드 Parent.field에 액세스하려고"더 구체적으로 ,있는 IllegalAccessError를 제공

URLClassLoader classLoader = new URLClassLoader(new URL[] { new URL("http://mysite.com/classes/") }); 
(Parent) instance = (Parent)classLoader.loadClass("somepackage.ChildClass").newInstance(); 
instance.callSomeMethod(); 

는 또한 모든 로컬 클래스가 원격/인터넷 것과 동일하다는 것을 나는 다운로드하지 않으려는 점에 유의하시기 바랍니다 파일을 내 클래스 경로에 저장하십시오.

답변

0

다른 클래스 로더를 사용하면 자식 클래스가 실제로 부모 인스턴스가 아닐 수도 있습니다. 따라서 하나의 클래스 로더에 Parent를로드하고 다른 클래스 로더에 Child를로드 한 경우, 하위 클래스가 다른 클래스 로더의 부모 객체와 함께 작동하면 문제가 발생할 수 있습니다.

내가이 상황에 적용되는지 확실하지 않으므로이 대답을 고려하십시오. 실패한 메서드의 세부 정보와 액세스 할 수없는 필드의 선언을 보는 것이 도움이됩니다. .

0

IllegalAccessError는 코드 (일부 방법)가 필드에 액세스하려고하거나 액세스 한정자가 할 수 없다고 말하는 메서드를 호출 할 때 발생합니다.

일반적으로 이렇게하려고하면 Java 컴파일 오류가 발생합니다. 하지만 "원격로드"가 정적 검사를 끝까지 수행하고있는 것으로 보입니다.

두 가지 가능한 설명을 생각할 수 있지만 더 자세한 정보가 없으면 구별하기가 어렵습니다. 예 : 실제 코드 및 실제 스택 트레이스.

  • 당신은 원격 지역 중 하나에 다른 클래스의 버전을로드 할 수 있으며, 사용하려는 방법/필드는 서로 다른 액세스 할 수 있습니다. (컴파일러의 액세스 검사를이 방법으로 되돌릴 수는 없습니다. 실제로는 그렇게하려고합니다.)

  • JVM에는 클래스의 로컬 복사본과 원격 복사본이 모두있을 수 있습니다. 여기서 문제는 유형 시스템의 관점에서 두 가지 버전이 클래스가 서로 다릅니다. (예, 동일한 FQN을 가진 두 개의 다른 클래스와 심지어 동일한 코드 일 수도 있습니다.) 이로 인해 액세스 문제가 발생할 수 있습니다. 내가 두 번째는 IllegalAccessException보다는 IllegalAccessError로 나타낼 것이라고 생각하기 때문에

나는 그것이 첫 번째 문제라고 생각하는 경향이 있어요.

관련 문제