web-dev-qa-db-ja.com

プリミティブフィールドのタイプを確認してください

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

I can渡されたオブジェクトには、プリミティブではなく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
    }
}

これがあれば、もっときれいな方法が本当に欲しいです。より良い方法がなければ、受け取るオブジェクトにLonglongではなく)のみを使用するように要求する方がより良いAPIだと思います。

何か案は?

40
macbutch

Longプリミティブをチェックするために間違った定数を使用しています-Long.TYPEを使用してください。他の各プリミティブ型は、ラッパー上の同様の名前の定数で見つけることができます。例:Byte.TYPECharacter.TYPEなど.

66
mP.
o.getClass().getField("fieldName").getType().isPrimitive();
49
Droo

あなただけを使用することができます

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();
16
Peter Lawrey
  • 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は静的な定数メンバーであり、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();

answer for Integer.classとInteger.TYPEの違い の質問も確認してください

5
ahmed hamdy