Java 使用反射创建对象及其声明字段的JTree
我需要动态JTree,其中节点将是对象,当节点展开时,我将使用反射来获取声明的字段。所有非基本字段都将再次递归地成为节点,以此类推 下面是我的TreeNode课程的简短描述: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
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
}
问题:
谢谢我想说这看起来不像是一个典型的反射用例。无论如何,要尝试回答您的问题:
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点也不起作用,因为构造函数不是继承的。如果您只想创建一个用于类型内省的树,那么
类
对象就足够了。如果要显示现有对象,则已经有了对象(无需创建)。如果你想动态地创建对象,我现在没有主意了。我认为你应该解释(通过编辑问题)你需要你的类树做什么。啊,你是对的,这只适用于非默认构造函数,我来编辑。