java 获取子类实际的类型名_Java 泛型类 以及 泛型类获取子类的具体参数类型 以及 获取子类型具体参数的实例...
前言:
要點都在代碼注釋中
1、泛型類?GenericInterface
package com.demo.generic;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class GenericInterface{//泛型類中有兩個泛型參數 T 和 K
protected ClasstClass;
protected ClasskClass;
//利用反射機制獲取泛型類子類泛型參數的具體類型-這個必須寫在構造方法中
public GenericInterface() {
tClass=(Class) getModelClass(tClass, 0);
kClass=(Class) getModelClass(kClass, 1);
System.out.println("泛型類構造方法獲取到了第一個泛型參數具體類型 tClass="+tClass+"["+this.getClass()+"]");
System.out.println("泛型類構造方法獲取到了第二個泛型參數具體類型 kClass="+kClass+"["+this.getClass()+"]");
}
//泛型類作為父類,可以獲取子類的所有實際參數的類型
@SuppressWarnings("unchecked")
public Class> getModelClass(Class modelClass,int index){
Type genType = this.getClass().getGenericSuperclass();// 得到泛型父類
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();//一個泛型類可能有多個泛型形參,比如ClassName這里有兩個泛型形參T和K,Class Name這里只有1個泛型形參T
if(params.length-1M getModel(ClassmClass,M mModel,int index) {
try {
mModel = (M) getModelClass(mClass,index).newInstance();
} catch (Exception e) {
mModel = null;
}
return mModel;
}
}
2、泛型類的實現類GenericInterfaceImpl
package com.demo.generic;
public class GenericInterfaceImpl extends GenericInterface{
//泛型參數的具體獲取是在泛型類中完成的,這有兩個前提
//1是子類繼承泛型類,且指定了具體的參數的類型
//2泛型類獲取子類的具體參數類型必須在構造方法中聲明
public GenericInterfaceImpl() {
// TODO Auto-generated constructor stub
System.out.println("泛型類繼承類被實例化,泛型參數被具體化"+"["+this.getClass()+"]");
}
}
3、測試類?TestGenericInterfaceImpl
package com.demo.generic;
import org.junit.Test;
public class TestGenericInterfaceImpl {
@Test
public void test1(){
//實例化泛型類的繼承類
GenericInterfaceImpl G=new GenericInterfaceImpl();
//讓泛型類為第一個泛型參數實例化
GenericModel gModel=G.getModel(G.tClass, G.tModel, 0);
gModel.setName("Jecket");
System.out.println("Model's Name is "+gModel.getName()+"["+this.getClass()+"]");
//讓泛型類為第二個泛型參數實例化
String temStr=G.getModel(G.kClass,G.kModel,1);
temStr="Hello World!";
System.out.println("temStr="+temStr+"["+this.getClass()+"]");
}
}
4、運行效果
泛型類構造方法獲取到了第一個泛型參數具體類型 tClass=class com.demo.generic.GenericModel[class com.demo.generic.GenericInte
rfaceImpl]
泛型類構造方法獲取到了第二個泛型參數具體類型 kClass=class java.lang.String[class com.demo.generic.GenericInterfaceImpl]
泛型類繼承類被實例化,泛型參數被具體化[class com.demo.generic.GenericInterfaceImpl]
Model's Name is Jecket[class com.demo.generic.TestGenericInterfaceImpl]
temStr=Hello World![class com.demo.generic.TestGenericInterfaceImpl]
原創聲明:http://blog.csdn.net/bestcxx/article/details/54708839
現在增加第二種方法
在思路上,依舊是泛型類和實現類,不同之處在于,這次獲取子類的具體實施類型的代碼不在泛型類中,而是放在了子類中,準確的說,是子類實現了父類的抽象方法
枚舉類
abstract protected ClassgetEntityClass();
子類繼承之
@Override
protected ClassgetEntityClass() {
// TODO Auto-generated method stub
return Book.class;
}
枚舉類:
public abstract class BaseDaoImpl {
protected SessionFactory sessionFactory;
@Autowired
public void setSessionFactory(SessionFactory sessionfactory){
this.sessionFactory = sessionfactory;
}
protected Session getSession(){
return sessionFactory.getCurrentSession();
}
/**
* 獲得Dao對于的實體類
* 這個方法需要繼承類來實現,return 具體實體類.class
* @return
*/
abstract protected ClassgetEntityClass();
/**
* @see Session.get(Class,Serializable)
* @param id
* @return 持久化對象
*/
protected T get(PK pk) {
@SuppressWarnings("unchecked")
T entity = (T) getSession().get(getEntityClass(), pk);
return entity;
}}實現類
@Repository
public class BookDaoImpl extends BaseDaoImplimplements BookDao {
@Override
public Book get(String pk) {
// TODO Auto-generated method stub
return super.get(pk);
}
@Override
protected ClassgetEntityClass() {
// TODO Auto-generated method stub
return Book.class;
}}
涉及到了BookDao,也貼一下
public interface BookDao{
Book get(String id);
ListgetListByHql(String hql,Mapmap);
}
總結
以上是生活随笔為你收集整理的java 获取子类实际的类型名_Java 泛型类 以及 泛型类获取子类的具体参数类型 以及 获取子类型具体参数的实例...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CUDA从入门到精通(零):写在前面
- 下一篇: CUDA从入门到精通(三):必备资料