55

オブジェクトのフィールドのタイプを判別しようとしています。オブジェクトが渡されたときのタイプはわかりませんが、longsであるフィールドを見つける必要があります。ボックス化されたsを区別するのは簡単ですLongが、プリミティブlongはより難しいようです。

渡されたオブジェクトには、プリミティブではなく、のみが含まれていることを確認できますLongsが、そうではありません。だから私が持っているのは:

for (Field f : o.getClass().getDeclaredFields()) {
    Class<?> clazz = f.getType();
    if (clazz.equals(Long.class)) {
        // found one -- I don't get here for primitive longs
    }
}

うまくいくように見えるハッキーな方法はこれです:

for (Field f : o.getClass().getDeclaredFields()) {
    Class<?> clazz = f.getType();
    if (clazz.equals(Long.class) ||  clazz.getName().equals("long")) {
        // found one
    }
}

もしあれば、これを行うためのよりクリーンな方法が本当に欲しいです。より良い方法がない場合は、受け取ったオブジェクトにLong(ではなくlong)のみを使用するように要求する方が、より優れたAPIになると思います。

何か案は?

4

4 に答える 4

68
o.getClass().getField("fieldName").getType().isPrimitive();
于 2009-12-12T04:30:34.670 に答える
23

あなたはただ使うことができます

boolean.class
byte.class
char.class
short.class
int.class
long.class
float.class
double.class
void.class

リフレクションを使用している場合、なぜ気にするのか、なぜこのチェックを行うのか。get / setメソッドは常にオブジェクトを使用するため、フィールドがプリミティブ型であるかどうかを知る必要はありません(プリミティブ型をnull値に設定しようとしない限り)。

実際、get()メソッドの場合、それがどのタイプであるかを知る必要はありません。できるよ

// any number type is fine.
Number n = field.get(object);
long l = n.longValue();

数値タイプかどうかわからない場合は、

Object o = field.get(object); // will always be an Object or null.
if (o instanceof Number) {
     Number n = (Number) o;
     long l = n.longValue();
于 2009-12-12T15:29:47.513 に答える
8
  • longタイプを使用してフィールドを検出するにはlong.classまたはLong.TYPE.

  • Longタイプを使用してフィールドを検出するにはLong.class.

例:

for (Field f : o.getClass().getDeclaredFields()) {
    Class<?> clazz = f.getType();
    // to detect both Long and long types
    if (Long.class.equals(clazz) || long.class.equals(clazz)) {
        // found one
    }
}

注意:

Long.TYPEは static Constant メンバーであり、 と同等long.classです。

スニペット コード フォームLongクラス

/**
 * The {@link Class} object that represents the primitive type {@code long}.
 */
@SuppressWarnings("unchecked")
public static final Class<Long> TYPE
        = (Class<Long>) long[].class.getComponentType();

Integer.class と Integer.TYPE の違いの質問に対する回答も確認してください

于 2016-09-07T17:18:29.940 に答える