文档

Java™ 教程
隐藏目录
获取字段类型
路径: 反射API
课程: 成员
部分: 字段

获取字段类型

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

        // 生产代码应更优雅地处理这些异常
	} 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,因为泛型是通过类型擦除实现的,在编译期间删除有关泛型类型的所有信息。因此,T被替换为类型变量的上界,即java.lang.Object

Field.getGenericType()如果存在,将查找类文件中的签名属性。如果该属性不可用,则回退到未改变的Field.getType()。反射中其他具有名称getGenericFoo的方法也以类似的方式实现。


上一页: 字段
下一页: 检索和解析字段修饰符