2011-02-09 3 views
0

클래스의 각 인스턴스에 대해 URLClassLoader에 의해로드되는 클래스가 있으므로, 정적 변수가 있으면 다른 인스턴스에 액세스 할 수 있습니까? 예를 들어클래스의 다른 인스턴스는 다른 클래스의 정적 변수에 액세스 할 수 있습니까?

, 클래스 MyClass에 다음, 것이다 클래스 로더 A와 클래스 로더 B에 의해로드, 나는 MyClass에 그래서 기본적으로

B.

에 의해로드 같이에서로드 MyClass에이 같은 정적 필드가 것인지 알고 싶어한다 문은 항상 참이어야합니다.

A.loadClass("MyClass").getField("MyField").get(null).equals(B.loadClass("MyClass").getField("MyField").get(null)); 
+0

@Arnaud, 당신의 제안 편집에 관한 다음 포맷 코드는 실제로 좋은 일입니다. 그러나 태그의 수를 "단순화"할 이유가 없습니다. 모두 5를 사용하면 사이트의 질문을 분류하는 데 도움이되고 가능하면 관련 질문에 링크 된 자동화 된 알고리즘을 지원하므로 도움이됩니다.정적 변수 *에 대한 태그는이 질문에 속합니다. 미래의 편집을 염두에 두어야 할 것. –

답변

1

불행히도 @ Dinesh/@ DAJ의 대답이 잘못되었습니다. (@ Romain의 어쩌면 문법은 구문 분석하기가 어렵습니다.)

클래스가 a.b.C이고 두 클래스 로더가 같은 클래스를로드한다고 가정합니다. 스펙에 따르면, 완전한 이름이 a.b.C 인 두 개의 별개의 Class 오브젝트와 유형 시스템 관점에서 두 개의 고유 한 유형으로 끝납니다. 각 유형에는 다른 정적 변수 세트가 있습니다.

이에 대한 주요 기준은 JLS 4.3.4 인 - 제 2 항 및 제 3

넌 (런타임) 구별되는 각각의 기준 유형 JLS 4.12.3, JLS 8.3.1.1, JLS 12.4에서 정역학의 고유 세트를 가질 것으로 추측 할 수 있고 언어 사양의 다른 부분.


그러니까 기본적으로, 다음 문은 항상 true 될 것입니다 : 그것은하지 않습니다 일반적으로

A.loadClass("MyClass").getField("myField").get(null) 
    .equals(B.loadClass("MyClass").getField("myField").get(null)); 

합니다.

MyClassmyField으로 초기화되는 방식에 따라 항상 일부는 경우에 해당됩니다. 예를 들어 필드가 리터럴 String으로 초기화되면 필드가 초기화됩니다.

(이 관찰에 대한 트릭은 MyClass실제로 두 개의 클래스 로더 공통 조상 클래스 로더에 의해 AB, 그리고에 의해를로드되었는지 마련하는 것입니다.)

+0

고마워. D 훌륭한 대답. 이제 어떻게 할 수 있습니까? O.o –

2

정적 변수는 클래스 로더에서 고유합니다. (이들에 대한 참조) 값은 같을 수 있습니다. equals를 사용하면 ==를 사용하여 작동합니다.

EDIT : 각 ClassLoader는 다른 클래스를로드합니다 (다른 버전 일 수도 있음). 초기화 된 통계는 달라집니다. 다른 ClassLoader의 두 개의 다른 클래스는 값이 동일한 변수 (정적 또는 비공유)를 가질 수 있습니다.

+0

"고유 한 클래스 로더"가 무엇을 의미하는지 설명해야합니다. –

+0

또한 A.loadClass ("MyClass"). equals (B.loadClass ("MyClass"))가 false가되는 것은 사실입니까? –

0

AFAIK, 누가 클래스를로드하는지는 중요하지 않습니다. 입력란이 정적 인 한 동일해야합니다. 몇 가지 코드를 실험 해 보셨습니까?

+0

아, 아니에요. 현재 설정되어있는 방식으로 동시 인스턴스가 필요하지 않지만 곧있을 것입니다. –

+0

일반적으로 몇 가지 코드를 빠르게 작성하여 사용해보고 싶습니다. 예를 들어, 그냥 정적 클래스를 만듭니다. 다른 로더를 사용하여 다른 클래스에로드하고 값을 비교하십시오. 정의에 따르면 '정적'은 모든 상황에서 정적처럼 행동해야합니다. 다르게 동작하면 Java 언어가 프로그래머에게 제공한다는 보장을 위반하게됩니다. –

+0

그래, 내가하는 시간의 90 %처럼, 나는 그렇게 할 시간이 없었다. (나는 URLClassLoader를 사용하지 않았고, 밤 10시와 같았다 : P) –