20

とりわけ次のメソッドを持つJavaオブジェクトがあるとしましょう。

public String getField1();
public String getField2();
public String getField3();
public String getField4();
public String getField5();

これらのメソッドを繰り返し処理して、次のコードのように'emを呼び出す方法はありますか?

String fields = "";
for(int i = 1; i <= 5; i ++){
   fields += object.(getField+i) + " | ";
}

今後のアイデアありがとうございます。

4

3 に答える 3

16
Class yourClass = YourClass.class;
for (Method method : yourClass.getMethods()){
    method.invoke(obj, args);           
}

このガイドを参照してください。

于 2010-07-23T08:40:49.717 に答える
11

リフレクションを使用する方法があります。

try{
  Method m= object.getClass().getMethod("getField"+String.valueOf(i), new Class[]{});
  fields+=(String)m.invoke(object);
}catch(...){...}

ただし、 このビジネスはすべて悪いコーディング慣行のにおいがします! getFieldN()このようにすべてのメソッドを書き直すことはできませんか?

String getField(int fieldNum)

番号付きメソッドを作成してトラブルを求めています。リフレクションは遅いため、文字列ベースのメソッド呼び出しがプログラムの流れに不可欠な場合にのみ使用する必要があることに注意してください。名前でメソッドを取得する必要があるユーザー定義のスクリプト言語で、この手法を使用することがあります。ここではまったくそうではありません。呼び出しはinteger-indexedです。したがって、整数をパラメーターとして保持する必要があります。

これがレガシー コードであり、この不適切なコーディングを絶対に変更できない場合は、getMethod(int)上記のように新しいメソッドを作成して既存のメソッドをラップし、番号付きのメソッドに委譲するだけの方法をお勧めしgetMethodN()ます。

于 2010-07-23T08:43:52.533 に答える
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", "|" ));
    }
}
于 2010-07-23T09:06:25.723 に答える