文档

Java™ 教程-Java Tutorials 中文版
获取字段类型
Trail: The Reflection API
Lesson: Members
Section: Fields

获取字段类型

字段可以是基本类型或引用类型。有八种基本类型:booleanbyteshortintlongcharfloatdouble。引用类型是 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();
	}
    }
}

下面是示例输出以获取此类中的三个公共字段的类型(bname 和参数化类型 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 的其他方法也是类似地实现。


Previous page: Fields
Next page: Retrieving and Parsing Field Modifiers