2013-04-15 3 views
3

두 개의 Java 프로젝트가 있습니다. 하나는 라이브러리이고 다른 하나는 콘솔 응용 프로그램입니다. 라이브러리 프로젝트에서 몇 가지 정적 멤버 변수 (전역 액세스 용)가있는 추상 클래스가 있습니다. 다음과 같이 보입니다.JAR 라이브러리에있는 추상 클래스의 정적 멤버 사용

public abstract class AbstractHelper 
{ 
    public static final VarType someVar = new VarType(); 
} 

두 가지 다른 클래스로 콘솔 응용 프로그램에서 정적 멤버 변수에 액세스합니다.

'someVar'은 두 가지 다른 클래스에서 고유 한 인스턴스를 사용하여 액세스합니다. 클래스 A의 인스턴스에서 'someVar'에 액세스하면 클래스 B의 인스턴스에서 'someVar'에 액세스 할 때와 다른 개체가 나타납니다.

그러나 AbstractHelper를 라이브러리 프로젝트에서 내 콘솔 응용 프로그램으로 이동하면 프로젝트, 다음 예상 된 동작 (여러 클래스간에 공유 된 정적 멤버 변수의 단일 인스턴스)

왜 이런 일이 일어날 지 알고 있습니까?

+9

다른 클래스 로더. –

+0

그럼, ClassA의 AbstractHelper와 ClassB의 AbstractHelper를로드하는 두 개의 다른 클래스 로더를 참조하여 확인하십시오. AbstractHelper가 같은 프로젝트의 일부일 때 왜 작동합니까? 이 경우 AbstractHelper가로드되지 않습니까? – user1972838

+0

다른 클래스 로더에서 AbstractHelper 클래스의 두 개 (또는 그 이상) 다른 인스턴스를 가질 수 있습니다. 이것은 여러 가지 방법으로 발생할 수 있습니다. 가장 일반적으로 다른 jar 파일에 클래스 사본이 두 개있는 경우입니다. 그런 일이 발생한다면 물론 정적 변수의 두 가지 인스턴스가 있습니다. –

답변

0

다른 클래스 로더를 사용하면이 문제가 발생할 수 있습니다. OSGI, java-ee 서버 및 다른 여러 기술을 사용하여 다른 클래스 로더를 JVM에 쉽게 주입 할 수 있습니다.

문제점을 해결할 수 있습니다. 동일한 클래스 경로에서 라이브러리 및 콘솔 어플리케이션 클래스를 모두 정의하십시오.

관련 문제