泛型類獲取泛型型別
1.再使用jdbcTemplate時有個query(sql, new RowMapper<User>(){} )方法,返回實體物件列表;
List<User> list = jdbcTemplate.query(sql, new RowMapper<User>() { List<User> users = new ArrayList<User>(); public User mapRow(ResultSet rs, int rowNum) throws SQLException { User user = new User(); user = new User(); user.setName(rs.getString("name")); user.setSex(rs.getString("sex")); return user; } });
想到這樣會有很多重複程式碼,看到spring提供了
List<User> list = jdbcTemplate.query(sql,new BeanPropertyRowMapper(User.class));
但其要求資料庫欄位和實體類欄位要完全一致;
想要資料庫欄位和實體類欄位不同的話,可以用註解去註釋資料庫欄位,通過反射獲取所有註解。
自己寫泛型的RowMapper藉口實現類,獲得泛型方法的泛型是關鍵步驟,得到泛型型別才可以通過反射得到想要的實體類
小例子:
package zjl.reflect; /** * 反射Test * * @author zjl * */ public class ReflectPoint<T> { private Class clazz; public ReflectPoint() { ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass(); this.clazz = (Class) type.getActualTypeArguments()[0]; System.out.println("TYPE 為:"+clazz.getSimpleName()); System.out.println(clazz); } public void printType(){ //System.out.println(this.getClass().getTypeParameters()[0]); System.out.println("TYPE 是-》"+clazz.getSimpleName()); } }
實現類:
package zjl.reflect;
public class BasePoint extends ReflectPoint<Student>{
}
測試類:
package zjl.reflect;
/**
*
* @author zjl
*
*/
public class ReflectTest {
public static void main(String[] args) throws Exception{
BasePoint bp = new BasePoint();
bp.printType();
}
}
再測試過程中,不能從當前類中直接或得當前類的泛型,而是獲得了父類的泛型,從而通過繼承來獲得自己的泛型類,因為繼承的父類已經確定了泛型型別了,從當前類中獲取泛型型別的方法沒有找到,不知道跟java泛型擦除有沒有關,有知道的請告知