剛開始使用泛型的時候,又愛又恨,苦於不知道如何獲取子類實現T類型,從而很多接口定義成:
<T> T queryForObject(String sql, Class<T> requiredType) throws DataAccessException;
后來看HibernateBaseDao的實現,終於找到了看到了人家解決途徑。不過只針對子類作用。能拿到T還是可以省不少事的。
Type genType = getClass().getGenericSuperclass(); Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); entityClass = (Class)params[0];
運用進自己的例子中,測試順利通過:
public abstract class JdbcDaoSupport<T> { private Class<T> clazz; @SuppressWarnings("unchecked") protected JdbcDaoSupport() { clazz = (Class<T>) ((ParameterizedType) getClass() .getGenericSuperclass()).getActualTypeArguments()[0];
System.out.println(clazz.getClass().getSimpleName()); } }
public class UserDao extends JdbcDaoSupport<User> { }
public class Test{ public static void main(String[] args) { UserDao dao = new UserDao(); } } 控制台: User
原理:
轉載:http://blog.csdn.net/ykdsg/article/details/5472591
這是泛型擦拭法使得Generic無法獲取自己的Generic Type類型。實際上BadClass<String>()實例化以后Class里面就不包括T的信息了,對於Class而言T已經被擦拭為Object,
而真正的T參數被轉到使用T的方法(或者變量聲明或者其它使用T的地方)里面(如果沒有那就沒有存根),所以無法反射到T的具體類別,也就無法得到T.class。而getGenericSuperclass()
是Generic繼承的特例,對於這種情況子類會保存父類的Generic參數類型,返回一個ParameterizedType,這時可以獲取到父類的T.class了,這也正是子類確定應該繼承什么T的方法。