前言:
要点都在代码注释中
1、泛型类 GenericInterface
package com.demo.generic;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class GenericInterface<T,K> {//泛型类中有两个泛型参数 T 和 K
protected Class<T> tClass;
protected Class<K> kClass;
//利用反射机制获取泛型类子类泛型参数的具体类型-这个必须写在构造方法中
public GenericInterface() {
tClass=(Class<T>) getModelClass(tClass, 0);
kClass=(Class<K>) 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> 这里有两个泛型形参T和K,Class Name<T> 这里只有1个泛型形参T
if(params.length-1<index){
modelClass=null;
}else{
modelClass=(Class) params[index];
}
return modelClass;
}
//--将泛型参数按照子类传入值实例化
//当在构造方法中为下面泛型参数实例化的时候,可以直接在子类使用 tModel 或者 kMode 处理业务逻辑
protected T tModel;
protected K kModel;
//将子类的泛型类实例化-获取实例化对象的方法
public <M> M getModel(Class<M> mClass,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<GenericModel,String> {
//泛型参数的具体获取是在泛型类中完成的,这有两个前提
//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]
原创声明:
现在增加第二种方法
在思路上,依旧是泛型类和实现类,不同之处在于,这次获取子类的具体实施类型的代码不在泛型类中,而是放在了子类中,准确的说,是子类实现了父类的抽象方法
枚举类
abstract protected Class<T> getEntityClass();
子类继承之
@Override
protected Class<Book> getEntityClass() {
// TODO Auto-generated method stub
return Book.class;
}
枚举类:
public abstract class BaseDaoImpl <T, PK extends Serializable>{
protected SessionFactory sessionFactory;
@Autowired
public void setSessionFactory(SessionFactory sessionfactory){
this.sessionFactory = sessionfactory;
}
protected Session getSession(){
return sessionFactory.getCurrentSession();
}
/**
* 获得Dao对于的实体类
* 这个方法需要继承类来实现,return 具体实体类.class
* @return
*/
abstract protected Class<T> getEntityClass();
/**
* @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 BaseDaoImpl<Book,String> implements BookDao {
@Override
public Book get(String pk) {
// TODO Auto-generated method stub
return super.get(pk);
}
@Override
protected Class<Book> getEntityClass() {
// TODO Auto-generated method stub
return Book.class;
}}
涉及到了BookDao,也贴一下
public interface BookDao{
Book get(String id);
List<Book> getListByHql(String hql,Map<String,String> map);
}