类加载器:实例化子类

时间:2015-11-24 11:02:22

标签: java class inheritance classloader static-members

我使用一个超类来存储对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初始化哪些(静态!)变量。

2 个答案:

答案 0 :(得分:0)

除了扫描整个类路径并加载类之外,超类无法知道哪些类扩展了它。

答案 1 :(得分:0)

因为当你的main方法在超类中时,JVM不需要在任何地方都没有引用的子类,所以JVM不会加载它并且不会实例化静态字段。

您可以检查所有classpath以强制加载期望的类,或者使用静态块来手动引用所有需要的子类,并使用类(在主类中通过示例引用)。通过这样做,所有子类都应该在运行时加载,但是你失去了自动注册子类的好处。