Java教程是为JDK 8编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
请参阅Java语言更改以获取Java SE 9及后续版本中更新的语言特性的摘要。
请参阅JDK发行说明以获取所有JDK版本的新功能、增强功能和已删除或弃用选项的信息。
字段可以是基本类型或引用类型。有八种基本类型:boolean
、byte
、short
、int
、long
、char
、float
和double
。引用类型是指直接或间接继承自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(); } } }
以下是检索此类中三个公共字段(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()
中有描述。
字段val
的类型报告为java.lang.Object
,因为泛型是通过类型擦除实现的,在编译期间删除有关泛型类型的所有信息。因此,T
被替换为类型变量的上界,即java.lang.Object
。
Field.getGenericType()
如果存在,将查找类文件中的签名属性。如果该属性不可用,则回退到未改变的Field.getType()
。反射中其他具有名称getGenericFoo
的方法也以类似的方式实现。