获取字段类型
原文: https://docs.oracle.com/javase/tutorial/reflect/member/fieldTypes.html
字段可以是原始字段或引用类型。有八种原始类型: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 bType: class [[ZGenericType: class [[Z$ java FieldSpy FieldSpy nameType: class java.lang.StringGenericType: class java.lang.String$ java FieldSpy FieldSpy listType: interface java.util.ListGenericType: java.util.List<java.lang.Integer>$ java FieldSpy FieldSpy valType: class java.lang.ObjectGenericType: T
字段b的类型是布尔值的二维数组。类型名称的语法在 Class.getName() 中描述。
字段val的类型报告为java.lang.Object,因为泛型是通过类型擦除实现的,它删除了编译期间有关泛型类型的所有信息。因此,T被类型变量的上限所取代,在本例中为java.lang.Object。
Field.getGenericType() 将查询类文件中的签名属性(如果存在)。如果该属性不可用,则它会回落到 Field.getType() ,而这种情况并没有因为引入泛型而改变。对 Foo 的某些值反映名称getGeneric _Foo_的其他方法也同样实现。
