获取字段类型
字段可以是原始类型或引用类型。有八种原始类型:boolean
,byte
,short
,int
,long
,char
,float
和double
。引用类型是java.lang.Object的直接或间接子类的任何东西,包括interface,数组和枚举类型。
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
)的示例输出。用户 Importing 以斜体显示。
$ 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
,因为泛型是通过类型擦除实现的,该类型在编译过程中会删除有关泛型的所有信息。因此T
被类型变量的上限(在这种情况下为java.lang.Object
)代替。
Field.getGenericType()将查询类文件中的 Signature 属性(如果存在)。如果该属性不可用,它会退回到Field.getType(),而引入泛型并没有改变该属性。以getGenericFoo
表示* Foo *的某些值的其他方法也类似地实现。