我有一个包含其他类的结构的类,这些类中的每一个也可能包含不同的类。所以这是类的树结构。
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(...)?
答案 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);
}
}
这将更容易使用。但是,设计成本是它迫使所有树深处的所有节点具有相同的行为。如果不需要,那么这可能不适合你。