Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
字段可以是基本类型或引用类型。有八种基本类型:boolean
,byte
,short
,int
,long
,char
,float
和 double
。引用类型是 java.lang.Object
的直接或间接子类,包括接口,数组和枚举类型。
示例在给定完全限定二进制类名称和字段名称的情况下打印字段的类型和泛型类型。FieldSpy
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
和参数化类型 list
)。用户输入以斜体显示。
$ 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.lang.Integer> $ java FieldSpy FieldSpy val Type: class java.lang.Object GenericType: T
字段 b
的类型是布尔值的二维数组。类型名称的语法在 Class.getName()
中描述。
字段 val
的类型报告为 java.lang.Object
,因为泛型是通过 type erasure (类型擦除) 实现的,它在编译过程中移除了关于泛型类型的所有信息。因此,T
被类型变量的上界所取代,在本例中为 java.lang.Object
。
Field.getGenericType()
将参考
类文件中的签名属性(如果存在)。如果该属性不可用,则它将返回 Field.getType()
,其不会因引入泛型而更改。在反射中,对于 Foo 的某些值的名为 getGenericFoo
的其他方法也是类似地实现。