field.gettype() 返回字段声明时的类型class对象,如list返回list.class而非arraylist.class,不反映运行时值类型,基本类型返回对应.class(如int.class),泛型信息被擦除,需用getgenerictype()获取。

Field.getType() 是 Java 反射中用于获取字段声明类型的 Class 对象的方法,它返回的是字段在源码中**声明时的类型**,而不是该字段当前实际引用的对象类型。
获取的是声明类型,不是运行时值类型
比如一个字段定义为 List<string> names;</string>,调用 field.getType() 返回的是 List.class(即 java.util.List 的 Class 对象),不会返回 ArrayList.class 或其他具体实现类,即使你给它赋了 new ArrayList() 的实例。
- 它只看字段声明语法,不关心赋了什么值
- 泛型信息会被擦除,所以无法通过
getType()拿到List<string></string>中的String - 若需获取泛型类型,要用
Field.getGenericType(),返回Type,再做类型判断和转换
基本用法示例
假设有一个类:
public class Person {
private String name;
private int age;
private List<string> tags;
}</string>
反射获取字段类型:
Field nameField = Person.class.getDeclaredField("name");
Class> nameType = nameField.getType(); // 返回 String.class
Field ageField = Person.class.getDeclaredField("age");
Class> ageType = ageField.getType(); // 返回 int.class(不是 Integer.class)
Field tagsField = Person.class.getDeclaredField("tags");
Class> tagsType = tagsField.getType(); // 返回 List.class
- 基本类型(
int、boolean等)返回对应包装类的.TYPE,如int.class - 引用类型返回其声明的类或接口的 Class 对象
- 数组类型字段(如
String[] data)返回String[].class
注意 getGenericType 和 getType 的区别
如果字段用了泛型,仅靠 getType() 不够:
-
field.getType()→ 返回原始类型,如List.class -
field.getGenericType()→ 返回ParameterizedType(如果是带泛型的),可进一步提取实际类型参数
例如对 List<integer> nums;</integer>:
Type genericType = field.getGenericType();
if (genericType instanceof ParameterizedType) {
Type[] typeArgs = ((ParameterizedType) genericType).getActualTypeArguments();
// typeArgs[0] 就是 Integer.class
}
常见误区提醒
- 别把
getType()和对象实例的getClass()混淆:后者返回运行时实际类型,前者只看声明 -
getType()返回的 Class 对象可能为null?不会,只要字段存在且可访问,它一定非 null - 私有字段需先调用
setAccessible(true)才能访问,否则会抛IllegalAccessException
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











