如何获取在类中确定的对象的实例

时间:2015-10-19 10:27:28

标签: java reflection

我有一个包含其他类的结构的类,这些类中的每一个也可能包含不同的类。所以这是类的树结构。

public class FirstLevelClass {
   public SecondLevelClass1 secondLevelClass1;
   public SecondLevelClass2 secondLevelClass2;
   ...
}

public class SecondLevelClass1 {
   public ThirdLevelClass thirdLevelClass;
   public String fieldSecondLevelClass;
   ...
}

我初始化了FirstLevelClass的变量。

FirstLevelClass firstLevelClass;

我需要获取存储在firstLevelClass中的secondLevelClass1的实例。如何使用SecondLevelClass1类的名称?

基本上我需要在SecondLevelClass1中获取字段的值。但是在写这篇文章时我失败了:

String fieldName = "fieldSecondLevelClass";
Field[] fields = firstLevelClass.getClass().getDeclaredFields();
Object foundValue = null;

for (Field field : fields) {
   Field foundField = null;
   foundField = field.getType().getDeclaredField(fieldName);
   foundValue = fieldSecondLevelClass.get((Class.forName(foundField.getDeclaringClass().getName())).newInstance());
}

因为我调用fieldSecondLevelClass.get(...)的实例未初始化。但如果我写

foundValue = foundField.get(((FirstLevelClass) firstLevelClass).secondLevelClass1);

它会正常工作。 那么,你们中的任何一个想法如何将secondLevelClass1的正确实例和FirstLevelClass实例传递给fieldSecondLevelClass.get(...)?

2 个答案:

答案 0 :(得分:0)

您的所有字段都是公开的,因此您可以将它们与'。'一起使用。 在这种情况下, firstLevelClass.secondLevelClass1 就足够了。

另一件事是我没有看到

的变量声明
  

fieldSceondLevelClass

答案 1 :(得分:0)

很难理解你想要做什么,但我会尝试为你简化这个。

首先,您的字段被声明为公共字段。即使它们不是,你也可以暴露getter / accessors,所以没有理由反思。

对我来说,这也是一个红旗,你有一级第一级,另一级第二级,第三级第三级。我想这取决于这些类型在其界面中的变化程度。如果这个树需要超过3个级别,我建议将它们抽象为一个通用的Node类,它引用了它的子节点,你可以按任意顺序嵌套它们。

public class Node {
    private List<Node> children = new ArrayList<>();

    public void addChild(Node c) {
       children.add(c);
    }

    public Node[] getChildren() {
        return children.toArray(new Node[0]);
    }
}

public class SomethingElse {
    public static void main(String[] args) {
        Node firstLevel = new Node();
        Node secondLevel = new Node();
        secondLevel.addChild(new Node());
        firstLevel.addChild(secondLevel);
    }
}

这将更容易使用。但是,设计成本是它迫使所有树深处的所有节点具有相同的行为。如果不需要,那么这可能不适合你。