Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.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 使用反射创建对象及其声明字段的JTree_Java_Reflection_Jtree - Fatal编程技术网

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

Java 使用反射创建对象及其声明字段的JTree,java,reflection,jtree,Java,Reflection,Jtree,我需要动态JTree,其中节点将是对象,当节点展开时,我将使用反射来获取声明的字段。所有非基本字段都将再次递归地成为节点,以此类推 下面是我的TreeNode课程的简短描述: public TreeNode(Object o){ this.name = o.getClass().getSimpleName(); this.treeobjectclass = o.getClass(); this.isbranch = isBranchObject

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

}
问题:

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

  • 我是否应该将类参数而不是对象传递给构造函数

  • 如果我这样做了,如果以后我需要得到这个类的对象,然后我尝试使用class.getConstructor——同样,我没有参数
  • 如何摆脱这个该死的循环?我对反思完全陌生。有类似工作的例子吗


    谢谢

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

  • 您可以使用
    ctor.setAccessible(true)
    启用默认构造函数,而不管它是否私有,并使用例如
    clazz.newInstance()
    对其进行实例化。然而,如果它不存在,那么您就陷入了构造函数参数的猜测游戏,或者陷入了
    sun.misc.Unsafe.allocateInstance(clazz)
    ,两者都不是您喜欢的

  • 无论您使用它做什么,看起来它应该满足类引用的要求。传递一个对象意味着它被使用了,而实际上它不是

  • 如果您只需要传递一个对象来获取它的构造函数参数,那么我建议您最好为该对象传递一个参数,以完全避免反射。这也是甲骨文公司的建议

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

    interface FactoryProvider<T> {
        public T getInstance();
    }
    
    class Concrete  implements FactoryProvider<Concrete> {
    
        @Override
        public Concrete getInstance() {
            return new Concrete();
        }
    }
    
    interface FactoryProvider{
    公共T getInstance();
    }
    类具体实现FactoryProvider{
    @凌驾
    公共具体getInstance(){
    返回新混凝土();
    }
    }
    

    但是,同样,如果您能够完全控制以这种方式创建的所有对象的源代码,那么您可以自己强制要求它们都具有默认构造函数

    使用反射的动机是什么?也许Architecture可以为您自然地解决这些问题。@Johan Sjöberg:使用反射的原因是jtree将有复选框,当单击某个节点/叶上的复选框时,字段名将用于动态查询生成。对不起,你能解释一下“建筑”吗??我对它不熟悉。Thanx我在这里试图暗示的是,如果你为它设计程序,而不是使用反射,你也许可以使用常规的安装逻辑找到解决方案。@Johan Sjöberg:好的,如果我完全没有抓住要点,请原谅,但是我看不到其他方法来获取每个对象/类的字段,然后在不使用反射的情况下,对每个非基本字段递归地重复该过程?您说单击复选框时需要字段名吗?为它放置一个getter,或者利用侦听器模式,允许您的最终对象将必要的信息传递回动态查询生成器。如果需要实例化逻辑,请尝试使用patternPoint 1,如果没有参数构造函数,则无法使用。它仅在不提供其他构造函数时自动生成。第3点也不起作用,因为构造函数不是继承的。如果您只想创建一个用于类型内省的树,那么
    对象就足够了。如果要显示现有对象,则已经有了对象(无需创建)。如果你想动态地创建对象,我现在没有主意了。我认为你应该解释(通过编辑问题)你需要你的类树做什么。啊,你是对的,这只适用于非默认构造函数,我来编辑。