2012-12-28 2 views
9

java.lang.IllegalAccessError: tried to access field ConcreteEntity.instance from class Entityjava.lang.IllegalAccessError : 클래스 Entity에서 ConcreteEntity.instance 필드에 액세스하려고 시도했습니다.

Ok 그래서 여기에 거래가 있습니다. 기본 ClassLoader 내부에있는 액세스 유형 기본값이있는 필드 인 ConcreteEntity.instance에 액세스하려하고 Entity.getInstance은 자식 ClassLoader에 존재하는 방법입니다.

이제는 둘 다 같은 패키지에 있지만, IllegalAccessError이 던져지고 있다는 것을 명심하십시오. 이 문제에 대한 해결책은 실제로 ClassLoaderConcreteEntity 안에 Entity 클래스를로드하는 것과 관련이 없습니까?

0 new #14 <Entity> 
3 dup 
4 aload_0 
5 invokevirtual #18 <Adapter.getInstance> 
8 checkcast #20 <sl> 
11 getfield #24 <sl.d> 
14 invokespecial #25 <Entity.<init>> 
17 areturn 

예외는 "컴파일 된 후"생성 된 jclasslib at를 통해 검색된 바이트 코드입니다.

게시물을 정리 해줘서 고맙습니다.

+0

당신이 바이트 코드 컴파일러의 어떤 종류를 사용하여 런타임에 클래스를 수정하는 :

At run time, a class or interface is determined not by its name alone, but by a pair: its fully qualified name and its defining class loader. Each such class or interface belongs to a single runtime package. The runtime package of a class or interface is determined by the package name and defining class loader of the class or interface.

그리고 섹션 5.4.4에서

? –

+0

예. 그러나 조작 된 바이트 코드는 완벽합니다. – Justin

+0

수퍼 클래스 내부의 서브 클래스 필드에 액세스하려고합니까? 나는 그것이 허용되지 않는 것이라고 생각한다. –

답변

27

는 여러 클래스 로더를 다루고있는 것이 분명하다 귀하의 경우를 제외하고, a similar questionmy answer를 참조하십시오 동일한 패키지 이름. , the jvm spceification에서 인용 5.3 :

A field or method R is accessible to a class or interface D if and only if any of the following conditions is true:

...

R is either protected or package private (that is, neither public nor protected nor private), and is declared by a class in the same runtime package as D.

+0

정말로 흥미 롭습니다. 그래서 머리 꼭대기에서 일어나는 일에 대해 알고 있습니까? 만약 내가 A) 나의 구현을 바꿀 필요가있다. "슬프게도 그것을 단일 클래스 로더로 가져와야한다."또는 B) JVMSpec 클래스 로딩에서 좀 더 연구해라. – Justin

+0

'Entity'가' ConcreteEntity'가 보호되어야합니다.런타임 패키지의 개념은 보안상의 이유로 거기에 해결 방법이 있다고 생각하지 않습니다. –

+0

답변에 감사드립니다. 그것은 무슨 일이 일어나고 있는지 밝혀줍니다. 허용 된 것으로 표시되었습니다. – Justin

1

Javadoc : 일반적으로이 오류는 컴파일러에서 발견합니다. 이 오류는 클래스의 정의가 호환되지 않는 경우에만 런타임에 발생할 수 있습니다.

난 어려운 클래스 조작이 시도되었는데, 아마도 클래스로드, 두 클래스가로드되는 방식에 시간을 투자한다고 생각합니다. 드문 경우지만 명시 적 serialVersionId가 도움이 될 수 있습니다.

클래스가 관련이 있으면 (수퍼/하위 클래스) 인터페이스를 사용하여 해당 관계를 제거하려고합니다. 아마도 주사를 사용합니다. 클래스를 두 번 참조 /로드하지 않습니다.

죄송 합니다만 말씀 드릴 수없는 답변입니다. 그들은이 있더라도,

JVM이 다른 "런타임 패키지"에있을 다른 클래스 로더에서로드 된 클래스를 고려 :

+0

그래, 내가 생각하기에 낮은 수준의 엔지니어링 문제 야. 하지만 실수가 아니라면 정상적인 상황에서이 필드를 참조하는 데 문제가 없어야합니다. 슬프게도 난독 화가가 테스트 환경에서 작동하는 방식과 다른 경로를 찾아야 할 수도 있습니다. – Justin

관련 문제