Java 泛型类 以及 泛型类获取子类的具体参数类型 以及 获取子类型具体参数的实例
来源:互联网 发布:java swing开发工具 编辑:程序博客网 时间:2024/05/18 16:55
前言:
要点都在代码注释中
1、泛型类 GenericInterface<T,K>
package com.demo.generic;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;public class GenericInterface<T,K> {//泛型类中有两个泛型参数 T 和 Kprotected 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个泛型形参Tif(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 stubSystem.out.println("泛型类继承类被实例化,泛型参数被具体化"+"["+this.getClass()+"]");}}
3、测试类 TestGenericInterfaceImpl
package com.demo.generic;import org.junit.Test;public class TestGenericInterfaceImpl {@Testpublic 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.GenericInterfaceImpl]泛型类构造方法获取到了第二个泛型参数具体类型 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 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;}}实现类
@Repositorypublic class BookDaoImpl extends BaseDaoImpl<Book,String> implements BookDao {@Overridepublic Book get(String pk) {// TODO Auto-generated method stubreturn super.get(pk);}@Overrideprotected Class<Book> getEntityClass() {// TODO Auto-generated method stubreturn Book.class;}}
涉及到了BookDao,也贴一下
public interface BookDao{Book get(String id);List<Book> getListByHql(String hql,Map<String,String> map);}
0 0
- Java 泛型类 以及 泛型类获取子类的具体参数类型 以及 获取子类型具体参数的实例
- 获取java参数化类中泛型的具体类型
- 利用java反射获取泛型类的类型参数具体类对象
- 你不知道的泛型--获取具体的泛型参数类型
- nginx具体的配置以及参数说明
- 获取方法中泛型的具体类型
- 获取具体的泛型类型
- 从泛型类中获取子类的泛型参数的类型
- Java反射,根据类名创建带参数的实例(获取参数类型,参数等)
- Java反射,根据类名创建带参数的实例(获取参数类型,参数等)
- Java获取泛型的类型参数
- java反射机制之获取子类的具体泛型
- 如何通过反射获取泛型的具体类型
- 如何获取java中泛型参数的实际类型--反射获取
- AspectJ 切面获取方法参数并拿到具体的值
- 获取泛型类中的泛型参数的类型
- java获取泛型参数的类型的方法 - 实例讲解
- ParameterizedType应用,java反射,获取参数化类型的class实例
- 杭电 2023 ( 求平均成绩 ) java
- macOS Sierra安装Apache2.4+PHP7.0+MySQL5.7.16
- Groovy Closure简介
- 线段树从零开始
- Leetcode 78. Subsets题解
- Java 泛型类 以及 泛型类获取子类的具体参数类型 以及 获取子类型具体参数的实例
- 零基础入门深度学习(4) - 卷积神经网络
- 浅谈 STM32 硬件I2C的使用 (中断方式 无DMA 无最高优先级)
- linux爬虫开发环境配置python+selenium+phantomJS
- 杭电 2024 ( C语言合法标识符 ) java
- CentOS安装并设置MariaDB
- 6.2 UDP 原理2
- 总分 Score Inflation-洛谷 2722
- poj_2029 Get Many Persimmon Trees(区间和+dp)