博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ParameterizedType获取java泛型参数类型
阅读量:4968 次
发布时间:2019-06-12

本文共 6252 字,大约阅读时间需要 20 分钟。

前言

这两天在看以前写的ssh项目时,遇到一个问题就是封装的BaseDaoImpl抽象类,构造方法里面是这样写的。

Class
clazz; public BaseDaoImpl() { ParameterizedType pt = (ParameterizedType)getClass().getGenericSuperclass(); clazz = (Class
)pt.getActualTypeArguments()[0]; }

当时看到还真不知道里面到底是什么意思,记得以前写时是参考网上写的 ,于是我只有再去网上找答案了,一番搜索终于知道了。

ParameterizedType

  • getClass().getGenericSuperclass() 
    返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type,然后将其转换ParameterizedType。
  • getActualTypeArguments() 
    返回表示此类型实际类型参数的 Type 对象的数组。[0]就是这个数组中第一个了。简而言之就是获得超类的泛型参数的实际类型。

看意思可能不是很懂,我们直接看例子:

ClassDemo.java

1 package com.chen.demo; 2  3 import java.lang.reflect.ParameterizedType; 4 import java.lang.reflect.Type; 5  6 class param
{ 7 8 class A {} 9 class B extends A {}10 11 private Class
entityClass;12 public param () {13 Type type = getClass().getGenericSuperclass();14 System.out.println("getClass() == " + getClass());15 System.out.println("type = " + type);16 Type trueType = ((ParameterizedType)type).getActualTypeArguments()[0];17 System.out.println("trueType1 = " + trueType);18 trueType = ((ParameterizedType)type).getActualTypeArguments()[1];19 System.out.println("trueType2 = " + trueType);20 this.entityClass = (Class
)trueType;21 System.out.println("entityClass = " + entityClass);22 23 B t = new B();24 type = t.getClass().getGenericSuperclass();25 26 System.out.println("B is A's super class :" + ((ParameterizedType)type).getActualTypeArguments().length);27 }28 }29 30 class MyClass {31 }32 33 class MyInvoke {34 }35 36 public class ClassDemo extends param
{37 public static void main(String[] args) {38 ClassDemo classDemo = new ClassDemo();39 }40 }

我们再看打印结果:

getClass() == class com.chen.demo.ClassDemo

type = com.chen.demo.param<com.chen.demo.MyClass, com.chen.demo.MyInvoke>

trueType1 = class com.chen.demo.MyClass

trueType2 = class com.chen.demo.MyInvoke

entityClass = class com.chen.demo.MyInvoke

 

B is A's super class :0

从上面结果我们可以总结如下,通过ParameterizedType获取泛型参数Class类型,然后我们就可以通过Class干一系列事情了。。。。。

比如数据库基本CRUD的工具类,直接看工具代码如下:

1 public abstract class BaseDaoImpl
extends HibernateDaoSupport implements BaseDao
{ 2 3 Class
clazz; 4 5 public BaseDaoImpl(){ 6 //getClass().getGenericSuperclass()返回表示此 Class 7 //所表示的实体(类、接口、基本类型或 void)的直接超类的 Type 8 //然后将其转换ParameterizedType 9 //getActualTypeArguments()返回表示此类型实际类型参数的 Type 对象的数组10 //[0]就是这个数组中第一个了。11 12 ParameterizedType pt = (ParameterizedType)getClass().getGenericSuperclass();13 clazz = (Class
)pt.getActualTypeArguments()[0];14 }15 16 @Override17 public void save(T entity) {18 getHibernateTemplate().save(entity);19 }20 21 @Override22 public void delete(Serializable id) {23 getHibernateTemplate().delete(findObjectById(id));24 }25 26 @Override27 public void update(T entity) {28 getHibernateTemplate().update(entity);29 }30 31 @Override32 public T findObjectById(Serializable id) {33 return getHibernateTemplate().get(clazz, id);34 }35 36 @Override37 public List
findObjects() {38 Query query = (Query) getSession().createQuery("from " + clazz.getSimpleName());39 return query.list();40 }41 42 @Override43 public List
findObjects(QueryHelper queryHelper){44 Query listQuery = getSession().createQuery(queryHelper.getHql());45 List
parameters = queryHelper.getParameters();46 47 if(parameters != null){48 for(int i = 0; i

工具类用到了Spring的orm模块,其次我们最重用的就是可以通过ParameterizedType封装通用的CRUD工具类,在实际的项目中,我们让不同的业务模块继承至该工具类,然后就可以直接使用其CRUD方法了。

参考

 

另外一个例子

MyInterface.java

1 package com.chen.demo;2 3 public interface MyInterface
{4 void onSuccess(T data);5 }

 

MySuperClass.java

1 package com.chen.demo;2 3 public abstract class MySuperClass
{4 public abstract void onSuccess(T data);5 }

 

Student.java

1 package com.chen.demo;2 3 public class Student {4 5 }

 

ClassDemo.java

1 package com.chen.demo; 2  3 import java.lang.reflect.ParameterizedType; 4 import java.lang.reflect.Type; 5  6 //利用ParameterizedType获取java泛型的参数类型 7  8 public class ClassDemo { 9   public static void main(String[] args) {10       classTest();11       interfaceTest();12   }13   14   private static void classTest() {15       MySuperClass
mySuperClass = new MySuperClass
() {16 @Override17 public void onSuccess(Student data) {18 }19 };20 //getClass().getGenericSuperclass()返回表示此 Class 所表示的实体的直接超类的 Type21 ParameterizedType type = (ParameterizedType) mySuperClass.getClass().getGenericSuperclass();22 sysoType(type);23 }24 25 private static void interfaceTest() {26 MyInterface
myInterface = new MyInterface
() {27 @Override28 public void onSuccess(Student data) {29 }30 };31 ParameterizedType type = (ParameterizedType) myInterface.getClass().getGenericInterfaces()[0];32 sysoType(type);33 }34 35 private static void sysoType(ParameterizedType type) {36 /*com.chen.demo.MySuperClass
37 class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl38 class com.chen.demo.Student39 class java.lang.Class40 class java.lang.String41 class java.lang.Class42 43 com.chen.demo.MyInterface
44 class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl45 class com.chen.demo.Student46 class java.lang.Class47 class java.lang.String48 class java.lang.Class*/49 System.out.println(type + "\n" + type.getClass());50 //返回表示此类型实际类型参数的 Type 对象的数组,泛型的参数可能有多个,我们需要哪个就取哪个51 Type[] targets = type.getActualTypeArguments();52 for (int i = 0; i < targets.length; i++) {53 System.out.println(targets[i] + "\n" + targets[i].getClass());54 }55 }56 }

 

转载于:https://www.cnblogs.com/eustoma/p/8834515.html

你可能感兴趣的文章
寄存器
查看>>
bzoj1690/poj3621[Usaco2007 Dec]奶牛的旅行
查看>>
Linux设备驱动之中断支持及中断分层
查看>>
vue视频学习笔记02
查看>>
ECMAScript迭代语句
查看>>
Web服务器(容器)请求常见的错误及其解决方法
查看>>
在 Linux 系统中安装Load Generator ,并在windows 调用
查看>>
活动图
查看>>
selenium
查看>>
【树形dp练习】Y
查看>>
RXJAVA之创建被观察者
查看>>
zookeeper(3) 持久化
查看>>
Windows Socket I/O模型 以及 Linux Epoll模型 的有关资料(转)
查看>>
用guava快速打造两级缓存能力
查看>>
随服务初始化的Servlet
查看>>
如何修改eclipse中maven默认仓库路径
查看>>
mysql--插入,删除
查看>>
软件需求第四周安排
查看>>
判别模型、生成模型与朴素贝叶斯方法
查看>>
叠罗汉I
查看>>