这是关于编程的一般问题。我希望能够将一个参数放入一个函数并让一个对象调用该参数,例如:
void printCells(cell[] cellArr, String method) {
for (int i = 0; i < cellArr.length; i++) {
cell c = cellArr[i];
println(c.method);
}
}
这段代码只是一个实用功能,方便我使用,我希望能够在单元格对象中打印出一些值,它具有value,row,col,subrow和subcol的值。我想使用这个函数,如:
printCells(cells, subrow);
它将通过上面的for循环并打印出单元格数组中每个单元格对象的子行值,我将其作为cellArr传递。
这甚至可能吗?或者我需要一个长if语句,例如:
void printCells(cell[] cellArr, String method) {
for (int i = 0; i < cellArr.length; i++) {
cell c = cellArr[i];
if (method == "row"){
println(c.row);
} else if (method == "col"){
println(c.col);
}
}
等等。请让我知道!
答案 0 :(得分:2)
你可以使用反射来做,但使用lambdas可能更容易:
void printCells(cell[] cellArr, Function<cell, Object> getter) {
for (cell c : cellArr)
println(getter.apply(c));
}
然后你可以用类似
之类的东西来调用它printCells(cells, cell::getSubrow)
或
printCells(cells, cell -> cell.subrow) // thanks to Lino for suggestion
答案 1 :(得分:1)
我认为在xs0的答案中使用lambdas或方法引用是可取的,但如果你需要调用的方法只能通过其名称引用,或者你只能使用旧版本的Java(&lt; 8)然后值得使用reflection。
void printCells(cell[] cellArr, String getter) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
Method getterMethod = cell.class.getMethod(getter);
for (cell c : cellArr) {
println(getterMethod.invoke(c));
}
}
可以这样称呼:
printCells(cellArr, "getContent");
(请注意,您必须在帐户中处理抛出的异常。)