Java 得到 泛型类型

对于Class而言T已经被擦拭为Object,而真正的T参数被转到使用T的方法 (或者变量声明或者其它使用T的地方)里面(若是没有那就没有存根),因此没法反射到T的具体类别,也就没法获得T.class。而 getGenericSuperclass()是Generic继承的特例,对于这种状况子类会保存父类的Generic参数类型,返回一个 ParameterizedType,这时能够获取到父类的T.class了,这也正是子类肯定应该继承什么T的方法。java

public class param<T1, T2> {
	class A {}
	class B extends A {}
	
	private Class<T1> entityClass;
	protected param (){
		Type type = getClass().getGenericSuperclass();
		System.out.println("getClass()==" + getClass());
		System.out.println("type = " + type);
		Type trueType = ((ParameterizedType)type).getActualTypeArguments()[0];
		System.out.println("trueType1 = " + trueType);
		trueType = ((ParameterizedType)type).getActualTypeArguments()[1];
		System.out.println("trueType2 = " + trueType);
		this.entityClass = (Class<T1>)trueType;
		
		B t = new B();
		type = t.getClass().getGenericSuperclass();
	
		System.out.println("B is A's super class :" + ((ParameterizedType)type).getActualTypeArguments().length);
	}
}

public class subParam extends param<Myclass, Myinvoke> {
	public static void main(String[] args) throws Exception{
		subParam  s = new subParam();
	}
}

输出:this

getClass()==class com.example.test.subParam
type = com.example.test.param<com.example.test.Myclass, com.example.test.Myinvoke>
trueType1 = class com.example.test.Myclass
trueType2 = class com.example.test.Myinvoke
B is A's super class :0spa


贴一个看到代码code

public class RawDao<T> {
    protected Class<T> clazz;

    @SuppressWarnings("unchecked")
    public RawDao() {
        @SuppressWarnings("rawtypes")
        Class clazz = getClass();

        while (clazz != Object.class) {
            Type t = clazz.getGenericSuperclass();
            if (t instanceof ParameterizedType) {
                Type[] args = ((ParameterizedType) t).getActualTypeArguments();
                if (args[0] instanceof Class) {
                    this.clazz = (Class<T>) args[0];
                    break;
                }
            }
            clazz = clazz.getSuperclass();
        }
    }
相关文章
相关标签/搜索