获取泛型对象的泛型化参数
  首先假设我们有如下两个对象:
  public abstract class Foo<T> {
  //content
  }
  public class FooChild extends Foo<Bar> {
  //content
  }
  怎么获取子类在Foo中传入的泛型Class类型呢?
  比较常用的做法有以下两种:
  强制FooChild传入自己的class类型(这也是比较常用的做法):
  public abstract class Foo<T> {
  private Class<T> tClass;
  public Foo(Class<T> tClass) {
  this.tClass = tClass;
  }
  //content
  }
  public class FooChild extends Foo<Bar> {
  public FooChild() {
  super(FooChild.class);
  }
  //content
  }
  利用反射获取:
  public static Type[] getParameterizedTypes(Object object) {
  Type superclassType = object.getClass().getGenericSuperclass();
  if (!ParameterizedType.class.isAssignableFrom(superclassType.getClass())) {
  return null;
  }
  return ((ParameterizedType)superclassType).getActualTypeArguments();
  }
  方法ReflectionUtil#getParameterizedTypes(Object)利用反射获取运行时泛型参数的类型,并数组的方式返回。本例中为返回一个T类型的Type数组。
  为了Foo得到T的类型我们将会如下使用此方法:
  ...
  Type[] parameterizedTypes = ReflectionUtil.getParameterizedTypes(this);
  Class<T> clazz = (Class<T>)ReflectionUtil.getClass(parameterizedTypes[0]);
  ...
  注意:
  在java.lang.reflect.ParameterizedType#getActualTypeArguments() documentation:的文档中你能看见如下文字:
  in some cases, the returned array can be empty. This can occur. if this type represents
  a non-parameterized type nested within a parameterized type.
  当传入的对象为非泛型类型,则会返回空数组形式。
  检查对象是否存在默认构造函数
  public static boolean hasDefaultConstructor(Class<?> clazz) throws SecurityException {
  Class<?>[] empty = {};
  try {
  clazz.getConstructor(empty);
  } catch (NoSuchMethodException e) {
  return false;
  }
  return true;
  }
  方法ReflectionUtil#hasDefaultConstructor利用java.lang.reflect.Constructor检查是否存在默认的无参构造函数。
  获取指定类型中的特定field类型
public static Class<?> getFieldClass(Class<?> clazz, String name) {
if (clazz==null || name==null || name.isEmpty()) {
return null;
}
name = name.toLowerCase();
Class<?> propertyClass = null;
for (Field field : clazz.getDeclaredFields()) {
field.setAccessible(true);
if (field.getName().equals(name)) {
propertyClass = field.getType();
break;
}
}
return propertyClass;
}
  在某些情况下你希望利用已知的类型信息和特定的字段名字想获取字段的类型,那么ReflectionUtil#getFieldClass(Class<?>, String)可以帮助你。ReflectionUtil#getFieldClass(Class<?>, String) 利用Class#getDeclaredFields()获取字段并循环比较java.lang.reflect.Field#getName()字段名称,返回字段所对应的类型对象。