# 获取字段类型

> 原文： [https://docs.oracle.com/javase/tutorial/reflect/member/fieldTypes.html](https://docs.oracle.com/javase/tutorial/reflect/member/fieldTypes.html)

字段可以是原始字段或引用类型。有八种原始类型：`boolean`，`byte`，`short`，`int`，`long`，`char`，`float`和`double`。引用类型是 [`java.lang.Object`](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html) 的直接或间接子类，包括接口，数组和枚举类型。

[``FieldSpy`` ](example/FieldSpy.java)示例在给定完全限定二进制类名称和字段名称的情况下打印字段的类型和泛型类型。

```
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()`](https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#getName--) 中描述。

字段`val`的类型报告为`java.lang.Object`，因为泛型是通过 _ 类型擦除 _ 实现的，它删除了编译期间有关泛型类型的所有信息。因此，`T`被类型变量的上限所取代，在本例中为`java.lang.Object`。

[`Field.getGenericType()`](https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Field.html#getGenericType--) 将查询类文件中的签名属性（如果存在）。如果该属性不可用，则它会回落到 [`Field.getType()`](https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Field.html#getType--) ，而这种情况并没有因为引入泛型而改变。对 _Foo_ 的某些值反映名称 `getGeneric _Foo_`的其他方法也同样实现。