abstract class A<T> { public Class<T> getGenericType() { Class<T> clz = (Class<T>) (((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0]); return clz; } }
class B<T> extends A<T> { public static void main(String[] args) { B<String> b = new B<String>(); System.out.println(b.getGenericType()); } }
class C extends A<String> { public static void main(String[] args) { C c = new C(); System.out.println(c.getGenericType()); } }
class C按如上方式声明,则可以得到String.class;
以上转载(有所修改)自 http://bbs.chinaunix.net/thread-3677562-1-1.html
对于获取泛型的方法,比较完整的代码如下,
class BaseDaoImpl<T> implements IBaseDao<T> { public BaseDaoImpl() { Class<T> clz = (Class<T>) getSuperClassGenricType(this.getClass()); System.out.println(clz); } /** * 通过反射,获得定义Class时声明的父类的泛型参数的类型. 如无法找到,返回Object.class */ public static Class<Object> getSuperClassGenricType(final Class clz) { Type type = clz.getGenericSuperclass(); if(!(type instanceof ParameterizedType)) { return Object.class; } Type[] params = ((ParameterizedType)type).getActualTypeArguments(); if(!(params[0] instanceof Class)) { return Object.class; } return (Class) params[0]; } }
另外,badqiu的脚手架项目代码中,有另外一种方式,父类本身不获取泛型的具体类型,
仅提供抽象方法,由子类来提供具体的类型;
public abstract class A<T> { public abstract Class getEntityClass(); } public class B extends A<String> { public Class getEntityClass() { return String.class; } }
另外,请参考 http://developer.51cto.com/art/201103/250028.htm