Class<?>

field#getType() 方法返回的是一个 Class<?> 对象,如果要确定 ? 的具体类型,需要按照以下的方法进行判断。区分方式从基本类型和对象两大块入手。

判断基本类型

下面的表达式以 Long 为例:

  1. Long.TYPE == field.getType()

long 类型:

  1. long.class.isAssignableFrom(field.getType())

其他基础类型以此类推。

判断对象(isAssignableFrom)

使用对象类的 isAssignableFrom 方法确定类型。

方法定义

确定此 Class 对象表示的类或接口是否与指定的 Class 参数表示的类或接口相同,或者是它们的超类或超接口。
如果是,它返回 true ; 否则返回 false。
如果此 Class 对象表示基本类型,则如果指定的 Class 参数恰好是此 Class 对象,则此方法返回 true,否则返回 false。

判断 Long 类型:

  1. Long.class.isAssignableFrom(field.getType())

在这里,判断 Long 是否是 field.getType() ,或是 field.getType() 的超类或超接口。

判断String类型:

  1. String.class.isAssignableFrom(field.getType())

示例代码:

  1. public class StudentTest {
  2. public static void main(String[] args) {
  3. Class<Student> clazz = Student.class;
  4. Field[] fields = clazz.getDeclaredFields();
  5. for (Field field : fields) {
  6. if (Long.TYPE == field.getType() || Long.class.isAssignableFrom(field.getType())) {
  7. System.out.println("this is long type:" + field.getName());
  8. } else if (Integer.TYPE == field.getType()) {
  9. System.out.println("this is int type");
  10. } else if (String.class.isAssignableFrom(field.getType())) {
  11. System.out.println("this is String type");
  12. }
  13. }
  14. }
  15. @Data
  16. @EqualsAndHashCode(callSuper = false)
  17. @Accessors(chain = true)
  18. private static class Student {
  19. private long score;
  20. private int age;
  21. private String username;
  22. private Long size;
  23. }
  24. }

输出结果:

  1. this is long type:score
  2. this is int type
  3. this is String type
  4. this is long type:size