我使用一个超类来存储对SuperClass
的所有实例和各种子类的引用。
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;
}
}
令人困惑的是instances
的元素似乎依赖于哪个类main
方法。当我在main
中使用Superclass
方法时,仅
添加了inst1
,这在我的案例中是不可取的。
是否有任何机制来自定义jvm初始化哪些(静态!)变量。
答案 0 :(得分:0)
除了扫描整个类路径并加载类之外,超类无法知道哪些类扩展了它。
答案 1 :(得分:0)
因为当你的main方法在超类中时,JVM不需要在任何地方都没有引用的子类,所以JVM不会加载它并且不会实例化静态字段。
您可以检查所有classpath
以强制加载期望的类,或者使用静态块来手动引用所有需要的子类,并使用类(在主类中通过示例引用)。通过这样做,所有子类都应该在运行时加载,但是你失去了自动注册子类的好处。