假设我有一个Java对象,其中包括以下方法:
public String getField1();
public String getField2();
public String getField3();
public String getField4();
public String getField5();
有没有办法迭代这些方法并像下面的代码一样调用它们?
String fields = "";
for(int i = 1; i <= 5; i ++){
fields += object.(getField+i) + " | ";
}
感谢您提出的想法。
答案 0 :(得分:15)
Class yourClass = YourClass.class;
for (Method method : yourClass.getMethods()){
method.invoke(obj, args);
}
请参阅this guide以供参考。
答案 1 :(得分:9)
有一种方法可以使用反射:
try{
Method m= object.getClass().getMethod("getField"+String.valueOf(i), new Class[]{});
fields+=(String)m.invoke(object);
}catch(...){...}
<强>然而强>
这项业务都有糟糕的编码习惯!
你难道不能像这样重写所有getFieldN()
方法吗?
String getField(int fieldNum)
您通过创建编号方法来解决问题。请记住,反射很慢,只应在基于String的方法调用对程序流程绝对必要时使用。我有时会将此技术用于用户定义的脚本语言,您必须获取按名称的方法。完全不是这种情况,您的电话是整数索引。因此,您应该将整数作为参数保留。
如果这是遗留代码,并且您绝对无法更改此错误编码,那么您可能最好创建一个新方法getMethod(int)
,如上所述,以包装现有方法,只需委托编号为{{ 1}}方法。
答案 2 :(得分:0)
为了能够选择特定字段和顺序,您应该指定它们,即通过字段名称列表。
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.StringTokenizer;
public class CsvReflect {
int a = 10;
String b = "test";
Date d = new Date();
public int getA() {
return a;
}
public String getB() {
return b;
}
public Date getD() {
return d;
}
public static String toCsv(Object obj, String fields, String separator) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(fields,",");
while ( st.hasMoreElements() ) {
String field = st.nextToken();
Method getter = obj.getClass().getMethod("get"+ field, new Class[]{});
String val = "" + getter.invoke(obj, new Class[]{});
sb.append( val );
if ( st.hasMoreElements() ) {
sb.append(separator);
}
}
return sb.toString();
}
public static void main(String[] args) throws SecurityException, IllegalArgumentException, NoSuchMethodException, IllegalAccessException, InvocationTargetException {
CsvReflect csv = new CsvReflect();
System.out.println( csv.toCsv( csv ,"A,B,D", "|" ));
}
}