gpt4 book ai didi

java - 如何使用 java 反射返回包含对象以外的内容的集合

转载 作者:行者123 更新时间:2023-12-02 11:14:38 24 4
gpt4 key购买 nike

所以我的问题是我目前正在尝试使用java的反射来遍历树状结构。问题是我对每个结构唯一了解的是它可以包含三件事之一。字符串(叶子的)其他对象,或其他对象的列表。使用反射,我想对树进行 DFS,直到找到我正在寻找的节点。我的问题似乎是,当我使用反射来获取恰好属于 List 类型的字段时,我返回 List 并且无法向下转换正确的类型。这是我尝试过的一些示例。

使用字段

Object returnObj = new Object();
Field field = object.getClass().getDeclaredField(fieldClassName);
field.setAccessible(true);
List<DistributionPartnerRoleType> test = (List<DistributionPartnerRoleType>) field.get(object);

以及使用方法

    String methodName = "get" + Character.toUpperCase(fieldClassName.charAt(0)) + fieldClassName.substring(1);
Method[] getters = object.getClass().getMethods();
Method getter = getMethod(getters, methodName);
Type returnType = getter.getGenericReturnType();
if(returnType instanceof ParameterizedType){
Type actualType = ((ParameterizedType) returnType).getActualTypeArguments()[0];
Class actualClass = (Class) actualType;
returnObj = getter.invoke(object, null);
List<Object> newList = new ArrayList<Object>();
for(Object obj : (List<Object>)returnObj){
newList.add(actualClass.cast(obj));
}
returnObj = newList;
}

我知道问题在于对象确实属于 Object 类型,但函数和字段显式属于代码中声明的 List 类型

protected List<DistributionPartnerRoleType> distributionPartnerRole;

public List<DistributionPartnerRoleType> getDistributionPartnerRole() {
if (distributionPartnerRole == null) {
distributionPartnerRole = new ArrayList<DistributionPartnerRoleType>();
}
return this.distributionPartnerRole;
}

如果有人知道这个问题的解决方案,那就太好了,或者如果我需要采用反射以外的不同方法。

总结一下我的问题。 Invoke 返回一个 List 但列表中的对象实际上并不是该函数返回的类型,它们的类型是 java.lang.Object 有没有办法解决这个问题,或者动态访问列表对象是不可能的?

最佳答案

我认为在这种情况下使用反射不是一个好主意。在我看来,合适的用例很少。这通常表明您需要重新考虑您的方法。

在这种情况下,我建议您查看 Visitor design pattern 。访问者本身可以包含深度优先搜索的逻辑以及处理节点中的各种类型的数据。

在您的情况下,模式可能类似于:

interface Node {
void accept(NodeVisitor visitor);
}

class StringNode implements Node {
public String getValue();

public void accept(NodeVisitor visitor) {
visitor.visit(this);
}
}

class IntegerNode implements Node {
public int geValue();

public void accept(NodeVisitor visitor) {
visitor.visit(this);
}
}

class CompositeNode implements Node {
public void forEachChild(Consumer<Node> action);

public void accept(NodeVisitor visitor) {
visitor.visit(this);
}
}

interface NodeVisitor {
default void visit(StringNode node) {}
default void visit(IntegerNode node) {}
default void visit(CompositeNode node) {}
}

现在您的搜索算法可能如下所示:

class IntegerSearch implements NodeVisitor {
private final int target;
private final List<IntegerNode> results = new ArrayList<>();

void visit(IntegerNode node) {
if (node.getValue() == target)
results.add(node);
}
}

void visit(CompositeNode node) {
node.forEachChild(child -> child.accept(this));
}
}

禁止使用反射、转换或其他狡猾的惯用语!

这可能与您的情况不完全匹配(例如,具有值的节点也许也是复合的?),但希望您看到避免反射的一般模式。

关于java - 如何使用 java 反射返回包含对象以外的内容的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50379679/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com