gpt4 book ai didi

java - 使用反射创建对象及其声明字段的 JTree

转载 作者:行者123 更新时间:2023-12-01 15:56:45 24 4
gpt4 key购买 nike

我需要动态 JTree,其中节点是对象,当节点展开时,我将使用反射来获取声明的字段。所有非原始字段都将再次成为节点,等等,递归地。

这是我的 TreeNode 类的简短描述:

 public TreeNode(Object o){

this.name = o.getClass().getSimpleName();
this.treeobjectclass = o.getClass();
this.isbranch = isBranchObject();
this.properties = initializePropertiesMap();
this.children = //here i will get children with getDeclared fields and
//instantiate new TreeNode for nonprimitive ones

}

问题:

  1. 当通过子类进行递归实例化时,当我遇到其构造函数要求参数的子类之一时,如何避免出现问题?

  2. 我是否应该将 Class 参数而不是 Object 传递给构造函数?

  3. 如果我这样做,如果稍后我需要获取此类的对象,然后我用 class.getConstructor 尝试它怎么办 - 再说一次,我没有参数。

如何摆脱这个被诅咒的循环?我对反射(reflection)完全陌生。有类似工作的例子吗?

谢谢

最佳答案

我想说这看起来不像反射的典型用例。无论如何,尝试回答您的问题:

  1. 您可以做的是启用默认构造函数,无论它是否是私有(private)的,使用 ctor.setAccessible(true) ,并使用例如 clazz.newInstance() 实例化它。但是,如果它不存在,则您将陷入构造函数参数的猜测游戏或进入 sun.misc.Unsafe.allocateInstance(clazz) ,这两者都不受欢迎。

  2. 你用它来做什么,看起来它应该足以满足类引用。传递一个对象意味着它已被使用,但事实并非如此。

  3. 如果您只需要传递一个对象来获取它的构造函数参数,那么我建议您最好传递 factory使该物体完全避免反射。这也是Oracle Secure Coding Guideline的推荐。

对传递工厂的修改是让您希望实例化的每个类提供自己的工厂逻辑,例如,

interface FactoryProvider<T> {
public T getInstance();
}

class Concrete implements FactoryProvider<Concrete> {

@Override
public Concrete getInstance() {
return new Concrete();
}
}

但话又说回来,如果您可以完全控制以这种方式创建的所有对象的源代码,您可以自己强制它们都具有默认构造函数。

关于java - 使用反射创建对象及其声明字段的 JTree,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4909438/

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