Joldnine / joldnine.github.io

My github.io blog repo. https://joldnine.github.io
2 stars 1 forks source link

Java: 用反射机制判断泛型和对象 #5

Open Joldnine opened 6 years ago

Joldnine commented 6 years ago

Java的反射机制 (Java Reflection)可以在Runtime阶段得到Java对象的信息。网上有很多实用教程,比如说 Java Reflection Example Tutorial

前段时间遇到一个有趣的问题:在runtime判断某个class里所有field的type,其中难点在于判断某个field是否为泛型(generic type)或者对象(java.lang.Object)。针对此难点特此记录。

思路如下:

  1. 用reflection或者classloader拿到class<?> 对象
  2. getDeclaredFields()方法拿到fields
  3. field.getType().equals(Object.class) 判断是否为java.lang.Object
  4. field.getGenericType() instanceof TypeVariable 判断是否为泛型。 注:在JVM里,泛型会是java.lang.Object,所以在这里需要进一步判断。

完整代码如下:

try {
    for (Field field : clazz.getDeclaredFields()) {
        try {
            if (field.getType().equals(Object.class)) {
                if (field.getGenericType() instanceof TypeVariable) {
                    System.out.println("Class: '%s' has generic type field: '%s'", clazz.getName(), field.getName();
                } else {
                    System.out.println("Class: '%s' has Object type field: '%s'", clazz.getName(), field.getName();
                }
            }
        } catch (TypeNotPresentException e) {
          // do something
        }
    }
} catch (NoClassDefFoundError) {
  // do something
}