通过方法“迭代”

时间:2010-07-23 08:38:09

标签: java methods call method-call

假设我有一个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) + " | ";
}

感谢您提出的想法。

3 个答案:

答案 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", "|" ));
    }
}