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

标签 java reflection jtree

我需要动态 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/

相关文章:

Java - 将字符串转换为矩形

java - 如何在网站中查找和提取 "main"图片

java - 获取 JTree 节点的正确行位置

reflection - kotlin 反射检查可空类型

java - JTree 节点不会在视觉上被选中

java - Netbeans GUI 生成器 : how to edit generated code

java - 不变性与类中的状态变化

java - 从 EntityManager 返回部分实体

.net - 为什么 MethodInfo.Invoke 将异常包装在 TargetInitationException 中?

c# - 如何用反射识别 lambda 闭包