オブジェクトのフィールドのタイプを判別しようとしています。オブジェクトが渡されたとき、オブジェクトのタイプはわかりませんが、long
sであるフィールドを見つける必要があります。ボックス化されたLong
sを区別するのは簡単ですが、プリミティブ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
}
}
これがあれば、もっときれいな方法が本当に欲しいです。より良い方法がなければ、受け取るオブジェクトにLong
(long
ではなく)のみを使用するように要求する方がより良いAPIだと思います。
何か案は?
Longプリミティブをチェックするために間違った定数を使用しています-Long.TYPE
を使用してください。他の各プリミティブ型は、ラッパー上の同様の名前の定数で見つけることができます。例:Byte.TYPE
、Character.TYPE
など.
o.getClass().getField("fieldName").getType().isPrimitive();
あなただけを使用することができます
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();
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の違い の質問も確認してください