我通过反射对一个新类进行初始化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));
...
答案 0 :(得分:1)
在完全构造对象之前发布对该对象的引用对于JVM是危险的,并且强烈建议不要这样做。
当JSR-133正在开发中,并且澄清了java内存模型时,声明JVM没有为引用在构造期间泄漏的对象提供线程安全保证。也就是说,有可能在已分配但未清零的线程之间引用泄漏等。
有关更多详细信息,请参阅JSR 133,Java内存模型和安全构建技术'。 http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#finalRight是一个很好的起点。