我通过反射初始化了一个新类,并用‘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访问“this”。是否可以在创建超类之后和创建基类之前以某种方式设置jt,使我可以在初始化期间访问'this‘(不添加非默认构造)?
public class LocalMotions extends JavaTask {
...
private int nb = super.jtListener.getParameter(NUMBER));
...发布于 2014-11-11 00:34:58
在对象完全构造之前发布对该对象的引用对于JVM来说是危险的,并且强烈建议您这样做。
当JSR-133在工作中,java内存模型被澄清时,声明JVM不会为在构造过程中泄漏的对象的引用提供线程安全保证。也就是说,引用可能会在已分配但未清零的线程之间泄漏,等等。
有关更多详细信息,请研究JSR133、Java内存模型和“安全构造技术”。http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#finalRight是一个很好的起点。
https://stackoverflow.com/questions/26847741
复制相似问题