Java使用泛型編程提取類名上T類型


剛開始使用泛型的時候,又愛又恨,苦於不知道如何獲取子類實現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的方法。

 


 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM