2013-04-15 3 views
3

У меня есть два Java-проекта: один - это библиотека, а другой - консольное приложение. В проекте библиотеки у меня есть абстрактный класс с несколькими статическими переменными-членами (для глобального доступа). Это выглядит примерно так:Использование статического члена из абстрактного класса, расположенного в библиотеке JAR

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

Я получаю доступ к статическим переменным-членам из консольного приложения в двух разных классах.

По какой-то причине «someVar» имеет уникальные экземпляры для двух разных классов, которые к нему обращаются. Если я получаю доступ к «someVar» из экземпляра класса A, я получаю другой объект, чем когда я обращаюсь к «someVar» из экземпляра класса B.

Однако, если я перемещаю AbstractHelper из проекта библиотеки в консольное приложение проект, то он имеет ожидаемое поведение (один экземпляр статической переменной-членом, разделяемой несколькими классами)

Кто-нибудь знает, почему это происходит?

+9

Разные погрузчики классов. –

+0

Итак, просто для подтверждения .. ссылка AbstractHelper от ClassA и из результатов ClassB в двух разных загрузчиках классов loading AbstractHelper? Почему это работает, когда AbstractHelper является частью одного и того же проекта? В этом случае не загружается AbstractHelper? – user1972838

+0

У вас могут быть два (или более) разных экземпляра класса AbstractHelper, в разных загрузчиках классов. Это может произойти несколькими способами, чаще всего, если у вас есть две разные копии класса в разных файлах jar. Если это произойдет, то, конечно, будут два разных экземпляра статической переменной. –

ответ

0

Это может произойти с использованием разных загрузчиков классов. OSGI, java-ee-серверы и несколько других технологий позволяют легко вставлять JVM в различные классы-загрузчики.

Вы можете решить эту проблему: определить как вашу библиотеку, так и классы консольного приложения в том же пути к классам.