2015-11-24 2 views
0

Я использую суперкласс, который хранит ссылки на все экземпляры SuperClass и различные подклассы.Class Loader: создавать статические поля подклассов

public class SuperClass{ 
    private static final Map<Integer,? extends SuperClass> instances=new TreeMap<>(); 
    private static final SuperClass inst1=new SuperClass(1,"1"); 
    public final int ref; // exemplary comparable property 
    private final Object commonAttribute; //exemplary 
    protected SuperClass(Object o,int ref){ 
    commonAttribute=o; 
    this.ref=ref; 
    instances.put(ref,this); 
    } 
} 

Когда я создаю экземпляр переменные подклассов, я надеюсь, что все экземпляры, которые будут добавлены к instances.

public class SubClass{ 
    private final Object specificAttr; 
    private static final SubClass inst2=new SubClass(2,"2","whatever"); 
    private final SubClass(Integer i,Object o1, Object o2){ 
    super(i,o1); 
    this.specificAttribute=o2; 
    } 
} 

Confusingly элементы instances, кажется, зависит от того в какой класс main метод. Когда у меня есть метод main в Superclass, только inst1 добавляется, что не требуется в моем случае. Есть ли какой-либо механизм для настройки, какие (статические!) Переменные инициализируются jvm.

+0

jvm создает статические переменные при загрузке класса. подробнее здесь http://stackoverflow.com/questions/3499214/when-does-static-class-initialization-happen. просто сделайте что-нибудь из списка с обоими классами – AdamSkywalker

ответ

0

Невозможно, чтобы суперкласс знал, какие классы его расширяют, за исключением сканирования всего пути к классам и загрузки классов.

0

Это потому, что, когда ваш основной метод находится в суперклассе, JVM не нуждается в подклассе, который нигде не упоминается, поэтому JVM не загружает его и не создает статические поля.

Вы можете проверить все classpath s для принудительной загрузки ожидаемых классов или класса (на примере основного класса на примере) со статическим блоком, который вручную ссылается на все требуемые подклассы. Делая это, все подклассы должны загружаться во время выполнения, но вы теряете преимущество автозарегистрированных подклассов.