A field may be either of primitive or reference type. There are eight primitive types:
boolean
,byte
,short
,int
,long
,char
,float
, anddouble
. A reference type is anything that is a direct or indirect subclass ofjava.lang.Object
including interfaces, arrays, and enumerated types.The
example prints the field's type and generic type given a fully-qualified binary class name and field name.
FieldSpy
Sample output to retrieve the type of the three public fields in this class (import java.lang.reflect.Field; import java.util.List; public class FieldSpy<T> { public boolean[][] b = {{ false, false }, { true, true } }; public String name = "Alice"; public List<Integer> list; public T val; public static void main(String... args) { try { Class<?> c = Class.forName(args[0]); Field f = c.getField(args[1]); System.out.format("Type: %s%n", f.getType()); System.out.format("GenericType: %s%n", f.getGenericType()); // production code should handle these exceptions more gracefully } catch (ClassNotFoundException x) { x.printStackTrace(); } catch (NoSuchFieldException x) { x.printStackTrace(); } } }b
,name
, and the parameterized typelist
), follows. User input is in italics.$ java FieldSpy FieldSpy b Type: class [[Z GenericType: class [[Z $ java FieldSpy FieldSpy name Type: class java.lang.String GenericType: class java.lang.String $ java FieldSpy FieldSpy list Type: interface java.util.List GenericType: java.util.List$ java FieldSpy FieldSpy T Type: class java.lang.Object GenericType: T The type for the field
b
is two-dimensional array of boolean. The syntax for the type name is described inClass.getName()
.The type for the field
val
is reported asjava.lang.Object
because generics are implemented via type erasure which removes all information regarding generic types during compilation. ThusT
is replaced by the upper bound of the type variable, in this case,java.lang.Object
.
Field.getGenericType()
will consult the Signature Attribute in the class file if it's present. If the attribute isn't available, it falls back onField.getType()
which was not changed by the introduction of generics. The other methods in reflection with namegetGenericFoo
for some value of Foo are implemented similarly.