Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java反射:在初始化期间设置超级类字段_Java_Reflection - Fatal编程技术网

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

Java反射:在初始化期间设置超级类字段,java,reflection,Java,Reflection,我通过反射对一个新类进行初始化,并用“this”设置一个超类字段: JavaTask jt = (JavaTask) clazz.newInstance(); for(Field f : clazz.getSuperclass().asSubclass(JavaTask.class).getDeclaredFields()) { if(f.getType().equals(JavaTaskListener.class)) { logger.trace("Set Ready

我通过反射对一个新类进行初始化,并用“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”(而不添加非默认构造)


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

当JSR-133在工作中,java内存模型得到澄清时,有人说JVM对在构建过程中泄漏的对象的引用没有线程安全保证。也就是说,引用可能在已分配但未归零的线程之间泄漏


有关更多详细信息,请研究JSR133、Java内存模型和“安全构造技术”。是一个很好的起点。

只是为了确认一下,您想在JVM完全创建对象层次结构之前,从构造函数中公开“this”的值吗?是的这是一个“监听器”,显然已经创建了。若它是由超类创建的对象,我可以在初始化期间从最终类内部访问它。我想用反射重现这种情况。jtListener是JavaTaskListener
public class LocalMotions extends JavaTask {
   ...
  private int nb = super.jtListener.getParameter(NUMBER));
   ...