Java获取泛型真实类型的方法

  1. 获取泛型类的泛型

    public abstract class AbstractDao {
        public Class getActualType() {
            ParameterizedType parameterizedType = (ParameterizedType) this.getClass().getGenericSuperclass();
            return (Class) parameterizedType.getActualTypeArguments()[0];
        }
    }
    
    public class UserDao extends AbstractDao {
        public static void main(String[] args) {
            UserDao userDao = new UserDao();
            Class actualType = userDao.getActualType();
            System.out.println(actualType.getName());
        }
    }
    
  2. 获取成员变量的泛型

    public class User {
        private List list;
        public static void main(String[] args) {
            try {
                Field field = User.class.getDeclaredField("list");
                Type genericType = field.getGenericType();
                if (genericType != null && genericType instanceof ParameterizedType) {
                    Type actualType = ((ParameterizedType) genericType).getActualTypeArguments()[0];
                    System.out.println(actualType.getTypeName());
                }
            } catch (Exception e) {
            }
        }
    }
    
  3. 获取局部变量的泛型,注意:泛型必须以匿名内部类的方式

    public abstract class AbstractDao {
    
        public Class getActualType() {
            ParameterizedType parameterizedType = (ParameterizedType) this.getClass().getGenericSuperclass();
            return (Class) parameterizedType.getActualTypeArguments()[0];
        }
    
        public static void main(String[] args) {
            AbstractDao dao = new AbstractDao() {
            };
            System.out.println(dao.getActualType().getTypeName());
        }
    }
    

你可能感兴趣的:(java实战案例)