2011-02-05 91 views
0

创建对象及其声明的字段的JTree的,我需要动态的JTree其中节点将对象和在节点展开,我会用反射来获得声明的字段。所有非原始字段将再次成为节点,依此类推,递归。与反思

因此,这里是我的树节点类的简短说明:

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. 如果我也许路过类参数,而不是对象为构造?

  3. 如果我这样做,如果以后我需要得到这个类的对象,我尝试用class.getConstructor - 再次,我没有参数。

如何摆脱这种诅咒的循环?我是全新的反思。任何类似工作的例子?

谢谢

+0

背后有什么使用反射这样做的动机是什么?也许_architechture_可以自然地为你解决这些问题。 – 2011-02-05 20:28:32

+0

@JohanSjöberg:使用反射的原因是jtree会有复选框,当单击某个节点/叶子上的复选框时,字段名称将用于动态查询生成。我很抱歉你能解释“建筑”吗?我不熟悉它。 Thanx – Julia 2011-02-05 20:32:38

回答

1

我会说这看起来并不像一个典型的使用情况进行反思。无论如何,尝试回答您的问题:

  1. 你可以做的是,无论它是私有的还是不说您启用默认的构造函数,使用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(); 
    } 
} 

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