获取字段类型

原文: https://docs.oracle.com/javase/tutorial/reflect/member/fieldTypes.html

字段可以是原始字段或引用类型。有八种原始类型:booleanbyteshortintlongcharfloatdouble。引用类型是 java.lang.Object 的直接或间接子类,包括接口,数组和枚举类型。

FieldSpy 示例在给定完全限定二进制类名称和字段名称的情况下打印字段的类型和泛型类型。

  1. import java.lang.reflect.Field;
  2. import java.util.List;
  3. public class FieldSpy<T> {
  4. public boolean[][] b = {{ false, false }, { true, true } };
  5. public String name = "Alice";
  6. public List<Integer> list;
  7. public T val;
  8. public static void main(String... args) {
  9. try {
  10. Class<?> c = Class.forName(args[0]);
  11. Field f = c.getField(args[1]);
  12. System.out.format("Type: %s%n", f.getType());
  13. System.out.format("GenericType: %s%n", f.getGenericType());
  14. // production code should handle these exceptions more gracefully
  15. } catch (ClassNotFoundException x) {
  16. x.printStackTrace();
  17. } catch (NoSuchFieldException x) {
  18. x.printStackTrace();
  19. }
  20. }
  21. }

下面是样例输出以检索此类中的三个公共字段的类型(bname和参数化类型list)。用户输入以斜体显示。

  1. $ java FieldSpy FieldSpy b
  2. Type: class [[Z
  3. GenericType: class [[Z
  4. $ java FieldSpy FieldSpy name
  5. Type: class java.lang.String
  6. GenericType: class java.lang.String
  7. $ java FieldSpy FieldSpy list
  8. Type: interface java.util.List
  9. GenericType: java.util.List<java.lang.Integer>
  10. $ java FieldSpy FieldSpy val
  11. Type: class java.lang.Object
  12. GenericType: T

字段b的类型是布尔值的二维数组。类型名称的语法在 Class.getName() 中描述。

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

Field.getGenericType() 将查询类文件中的签名属性(如果存在)。如果该属性不可用,则它会回落到 Field.getType() ,而这种情况并没有因为引入泛型而改变。对 Foo 的某些值反映名称getGeneric _Foo_的其他方法也同样实现。