標籤:
今天搭建架構的時候,要擷取泛型<T>的Class具體例子:
@EnableTransactionManagement@Transactional@Repositorypublic class BasicDAO<T> extends HibernateDaoSupport { //實體類 private T entity; private Class<T> entityClass; public BasicDAO() { //通過反射機制擷取泛型的類類型 entityClass = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0]; } public BasicDAO(T entity) { this.entity = entity; } public void save(T entity){ try { getHibernateTemplate().save(entity); } catch (DataAccessException e) { e.printStackTrace(); } } public void update(T entity){ try { getHibernateTemplate().update(entity); } catch (DataAccessException e) { e.printStackTrace(); } } public void delete(T entity){ Assert.assertNotNull(entity); try { getHibernateTemplate().delete(entity); } catch (DataAccessException e) { e.printStackTrace(); } } /** * 具體主鍵,返回實體 * @return id */ public T getModel(int id){ //通過反射機制擷取去實體模型 return getHibernateTemplate().get(entityClass,id); } /** * 自動注入SessionFactory * @param sessionFactory */ @Autowired public void setupSessionFactory(final SessionFactory sessionFactory) { this.setSessionFactory(sessionFactory); }}
若要在公用類中,要得到實體entity對象【見BaseDAO.java的getModel(int)方法】,光有主鍵還不夠,session還得知道實體的類類型,及BaseAction中的entityClass才行。
如何獲得呢?見【建構函式BasicDAO()】
下面為另外一篇部落格寫的例子:
public class Test<T> { public T newInstance(){ T instance=null; Class<T> entityClass = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];// …… return instance; };}
部落格地址:http://www.tashan10.com/tong-guo-fan-she-huo-qu-fan-xing-de-class/
另外若是通過獲得調用類的類類型改怎麼辦呢?經典的情境為日誌管理。
Java反射機制可以實現上面的訴求
public class LoggerUtils { private static Logger logger ; public static Logger getLogger() { if(logger == null){ //Java8 廢棄了Reflection.getCallerClass() logger= Logger.getLogger(Reflection.getCallerClass()); } return logger; }}
Java擷取泛型的類型Class