Java反射:在初始化期间设置超类字段

时间:2014-11-10 15:57:53

标签: java reflection

我通过反射对一个新类进行初始化a,并设置一个超类字段' this':

JavaTask jt = (JavaTask) clazz.newInstance();
for(Field f : clazz.getSuperclass().asSubclass(JavaTask.class).getDeclaredFields()) {
    if(f.getType().equals(JavaTaskListener.class)) {
        logger.trace("Set ReadyListener");
        f.setAccessible(true);
        f.set(jt, this);
    }
}

在这样的解决方案中,我可以访问这个'完成初始化后从新实例jt。是否有可能在创建超类之后以及在创建基类之前以某种方式设置jt我可以访问'这个'在初始化期间(不添加非默认构造)?

public class LocalMotions extends JavaTask {
   ...
  private int nb = super.jtListener.getParameter(NUMBER));
   ...

1 个答案:

答案 0 :(得分:1)

在完全构造对象之前发布对该对象的引用对于JVM是危险的,并且强烈建议不要这样做。

当JSR-133正在开发中,并且澄清了java内存模型时,声明JVM没有为引用在构造期间泄漏的对象提供线程安全保证。也就是说,有可能在已分配但未清零的线程之间引用泄漏等。

有关更多详细信息,请参阅JSR 133,Java内存模型和安全构建技术'。 http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#finalRight是一个很好的起点。