gpt4 book ai didi

Java反射: set super class field during initialization

转载 作者:行者123 更新时间:2023-12-01 12:18:32 25 4
gpt4 key购买 nike

我通过反射初始化一个新类,并用“this”设置一个父类(super class)字段:

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”。是否可以在创建父类(super class)之后和创建基类之前以某种方式设置 jt ,以便我可以在初始化期间访问“this”(无需添加非默认构造)?

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

最佳答案

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

当 JSR-133 处于工作状态并且 Java 内存模型得到澄清时,声明 JVM 对构造期间泄漏的对象的引用不提供线程安全保证。也就是说,引用可能会在已分配但未归零的线程之间泄漏等。

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

关于Java反射: set super class field during initialization,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26847741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com