0

タイトル失礼します…

以下に示すように使用される foo() のようなメソッドがあります

public static <T> void foo(T fld1, T fld2) {
    // here i use some info from fld1 and some from fld2 in order
    // to do something
}
foo(a1.myField, a2.myField)
  • コンパイル時に myField が実際にオブジェクトのフィールドであることを確認したい
  • .myField2回繰り返す必要を避けたい
  • メソッドを次のように呼び出せないようにしたいfoo(a1.myField, a2.anotherField);

リフレクションが私の問題に対する答えであるかどうかはわかりません。

私はこのようなものを書くことができます:

static <C> void foo(C o1, C o2, String fieldName) {
    try {
        Object fld1 = o1.getClass().getField(fieldName).get(o1);
        Object fld2 = o2.getClass().getField(fieldName).get(o2);
        // here i use some info from fld1 and some from fld2 in order
        // to do something
    } catch (Exception e) {
    }
}

しかし、fieldName がクラス C の有効なフィールド名であるかどうかをコンパイル時に確認できません。

方法があると助かります

Field getField(Object field)

となることによって

getField(a1.myField)

に等しい

a1.getClass().getField("myField")

今、私はこのメソッドを書きます:

public static <T> Field getField(T o, Object fld) {
    Field rv = null;
    try {
        Field[] fields = o.getClass().getFields();
        for (Field field : fields) {
            Object f = field.get(o);
            if (f==fld) {
                rv = field;
                break;
            }
        }
    } catch (Exception e) {
    }
    return rv;
}

このように使用します

getField(a1, a1.myField);

答えてくれてありがとう、カルロ

4

5 に答える 5

2

instanceOf実行時に in メソッドでチェックできます。

ちょうど例:

if(fd1 instanceOf Fd1Obj)
于 2013-06-18T10:49:00.287 に答える
2

コンパイル時に確認したい..

リフレクションはランタイムがすべてです。したがって、コンパイル時間には役立ちません。

于 2013-06-18T10:50:56.280 に答える
0

これは Java では冗長ですが、Java8 のラムダはそれほど冗長ではありません。必要なのは、型 C のオブジェクトから型 T の値に取得するコンパイル時にチェックされる方法です。Java でそれを指定する方法は、インターフェイスです。

public interface Getter<C, T> {
  T get(C c);
}

次に、関数を次のように指定します

static <C, T> void foo(C c1, C c2, Getter<C, T> getter) {
  T fld1 = getter.get(c1);
  T fld2 = getter.get(c2);
  // ...
}

そして、あなたはそれを次のように呼びます - これは厄介なほど冗長な部分です:

foo(a1, a2, new Getter<A, Integer>() {
    public Integer get(A a) { return a.fieldName; }
});

Java8 のラムダにより、これが劇的に読みやすくなります。

foo(a1, a2, a -> a.fieldName);
于 2013-06-18T13:02:54.367 に答える
0

それがオブジェクトであることを確認するための静的ジェネリックはどうですか:

static <T extends Object> void foo(T fld1, T fld2) {
   // ...
}

リフレクションを使用して、オブジェクトから名前付きフィールドを取得できます。

AType myField1 = (AType)fld1.getClass().getField("myField").get(fld1);
AType myField2 = (AType)fld2.getClass().getField("myField").get(fld2);
于 2013-06-18T10:51:55.877 に答える