我有 2 个带有 "n" 属性的对象,所有这些对象都在另一个对象上声明。
对象:
@Data
public class ObjectOne{
private String strAttribOne;
private Integer intAttribOne;
}
@Data
public class ObjectTwo{
private String strAttribTwo;
private Integer intAttribTwo;
}
主对象:
@Data
public class MainObject{
private ObjectOne objOne;
private ObjectTwo objTwo;
}
在另一个类中,我有一个包含所有方法的数组:
String[] getters = {
"getObjOne().getStrAttribOne",
"getObjTwo().getStrAttribTwo",
"getObjOne().getIntAttribOne",
"getObjTwo().getIntAttribTwo",
}
现在,我尝试使用 getMethod 调用我所有的方法
List<MainObject> mainObjects = returnData;
int x=0;
for (int i = 0; i < mainObjects.size(); i++) {
Method choosenMethod = MainObject.class.getMethod(getters[x]);
System.out.println(choosenMethod.invoke(mainObjects.get(i)));
x++
}
但这不起作用,调用此错误:
addAttachment file to request java.lang.NoSuchMethodException:
com.domain.MainObject.getObjOne().getStrAttribOne()
我的代码有什么问题?
getMethod 通过其名称获取方法,例如 getObjOne
.此处需要两种getMethod
用途,一种用于获取 getObjOne
方法,另一种用于获取 getStrAttribOne
方法。
更简单的解决方案是不要将这些 getter 表示为字符串。您可以有一个函数对象列表而不是字符串,然后调用其 apply 方法。这不需要复杂的反射使用:
List<Function<MainObject, Object>> getters = Arrays.asList(
o -> o.getObjOne().getStrAttribOne(),
o -> o.getObjTwo().getStrAttribTwo(),
o -> o.getObjOne().getIntAttribOne(),
o -> o.getObjTwo().getIntAttribTwo()
);
for (int i = 0; i < mainObjects.size(); i++) {
MainObject obj = mainObjects.get(i);
System.out.println(getters.get(i).apply(obj));
}
如果我没记错的话,
getMethod()
接受一个方法的名称。不能在字符串中使用 .
运算符。您需要单独存储方法的名称,一旦获得就会调用它们。