リフレクションを使用してField
の宣言型を取得するとします。
次のテストのどれがint
とInteger
のどちらを処理しているかを正しく示しますか?
Field f = ...
Class<?> c = f.getDeclaringClass();
boolean isInteger;
isInteger = c.equals(Integer.class);
isInteger = c.equals(Integer.TYPE);
isInteger = c.equals(int.class);
isInteger = ( c == Integer.class);
isInteger = ( c == Integer.TYPE);
isInteger = ( c == int.class);
Field.getType()
に基づいて(f.getDeclaringClass()
の代わりに)、以下を取得します。
Type: Java.lang.Integer
equals(Integer.class): true
equals(int.class) : false
equals(Integer.TYPE) : false
== (Integer.class) : true
== (int.class) : false
== (Integer.TYPE) : false
Type: int
equals(Integer.class): false
equals(int.class) : true
equals(Integer.TYPE) : true
== (Integer.class) : false
== (int.class) : true
== (Integer.TYPE) : true
Type: Java.lang.Object
equals(Integer.class): false
equals(int.class) : false
equals(Integer.TYPE) : false
== (Integer.class) : false
== (int.class) : false
== (Integer.TYPE) : false
次のことが当てはまることを意味します。
Integer.TYPE.equals(int.class)
Integer.TYPE == int.class
int
を扱っているのかInteger
を扱っているのかを知りたい場合は、次のいずれかのテストを使用できます。
isInteger = c.equals(Integer.class) || c.equals(Integer.TYPE);
isInteger = c.equals(Integer.class) || c.equals(int.class);
isInteger = (c == Integer.class) || (c == Integer.TYPE);
isInteger = (c == Integer.class) || (c == int.class );
私が見逃しているコーナーケースはありますか?はいの場合はコメントしてください。
_int.class
_は、_Integer.TYPE
_にコンパイルされます。ただし、これはフィールドを宣言するクラスを表すClass
オブジェクトを返すため、誤って Field.getDeclaringClass()
を使用していると思います。使用したいのは Field.getType()
です。