【问题标题】:Class Loader: instantiate static fields of subclasses类加载器:实例化子类的静态字段
【发布时间】:2016-02-26 18:57:47
【问题描述】:

我使用一个超类来存储对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 方法在哪个类中。当我在Superclass 中有main 方法时,只有 添加了inst1,这在我的情况下是不需要的。 是否有任何机制可以自定义 jvm 初始化哪些(静态!)变量。

【问题讨论】:

标签: java class inheritance classloader static-members


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    您可以检查所有classpaths 以强制加载预期的类,或者拥有一个带有静态块的类(通过示例在主类中引用),该静态块手动引用所有想要的子类。通过这样做,所有子类都应该在运行时加载,但您会失去自动注册子类的好处。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-15
      • 1970-01-01
      • 1970-01-01
      • 2016-03-11
      • 1970-01-01
      • 2020-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多