当前位置: 首页 > news >正文

Java 得到泛型中得到T.class

Java 得到泛型中得到T.class

https://www.cnblogs.com/onlysun/p/4539472.html

Java 得到泛型中得到T.class

Class <T> entityClass = (Class <T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 

 

getGenericInterfaces()和getGenericSuperclass()

 getInterfaces()和getSuperclass()

先来看看这两个方法都是干什么用的:

 

1. public Type getGenericSuperclass()

用来返回表示当前Class 所表示的实体(类、接口、基本类型或 void)的直接超类的Type。如果这个直接超类是参数化类型的,则返回的Type对象必须明确反映在源代码中声明时使用的类型。比如:

   

import java.lang.reflect.ParameterizedType;  
public class GT1 extends GT2<Integer>{  
    public static void main(String[] args) {  
        System.out.println(((ParameterizedType)new GT1().getClass().getGenericSuperclass()));  
    }  
}  

则输出结果即为:

GT2<java.lang.Integer>

 

    如果此Class代表的是Object 类、接口、基本类型或 void,则返回 null。。如果此对象表示一个数组类,则返回表示 Object 类的 Class 对象。

 

2. public Type[] getGenericInterfaces()

    与上面那个方法类似,只不过Java的类可以实现多个接口,所以返回的Type必须用数组来存储。

    以上两个方法返回的都是Type对象或数组,在我们的这个话题中,Class都是代表的参数化类型,因此可以将Type对象Cast成ParameterizedType对象。而 ParameterizedType对象有一个方法, getActualTypeArguments()。

public Type[] getActualTypeArguments()

用来返回一个Type对象数组,这个数组代表着这个Type声明中实际使用的类型。接着使用上面的例子:

 

import java.lang.reflect.ParameterizedType;  
public class GT1 extends GT2<Integer>{  
    public static void main(String[] args) {  
    System.out.println(((ParameterizedType)new GT1().getClass().getGenericSuperclass()).getActualTypeArguments()[0]);  
    }  
}  

这次的显示结果将是:class java.lang.Integer

      因此,我们可以通过继承+反射的方法,来的到T.class。

     需要说明的是,江南白衣使用的方法是将关键语句

     Class < T >  entityClass  =  (Class < T > ) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[ 0 ];

      放在了超类,也就是声明泛型的那个类的构造方法中。这样一来,子类在继承具有泛型的超类时,会自动调用超类的构造方法。在此超类的构造方法中,调用的getClass返回的是子类的Class类型(与通常的重写机制有悖,呵呵,有待深究,但测试结果确是如此),则在子类中就无需再显式地使用getGenericInterfaces()和getGenericSuperclass()等方法了。

     接着,再使用(Class<T>)对 getActualTypeArguments()返回的元素做casting,即可得到所谓的T.class。

原文地址http://blog.csdn.net/gengv/article/details/5178055

好记性不如烂笔头,内存虽快,但不持久

 

 

 

 

 

 

 

 

 

 

 

 

相关文章:

  • Animation 或者 Fbx 动画事件
  • AndroidStudio连接MUMU模拟器
  • Java_Object_wait()、notify()、notifyAll()
  • java如何创建一个泛型数组
  • Java中创建泛型数组
  • java创建泛型数组
  • Android Studio 代码格式化自动换行问题(强迫症)
  • wwise eventid soundbank
  • 简便快捷:如何在Wwise中管理您的SoundBanks
  • Unity项目接入Wwise
  • 资源几点想法
  • 【Unity3D Editor】导入图片自动转换成Sprite
  • Unity5.x版本项目中删除Library目录后重新打包AssetBundle时,MD5会莫名其妙的变化,何解?
  • unity assetBundle更新 打包变化
  • Unity 打包AssetBundle文件的MD5值变化问题
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • [笔记] php常见简单功能及函数
  • 【知识碎片】第三方登录弹窗效果
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • JavaScript 奇技淫巧
  • js递归,无限分级树形折叠菜单
  • Js基础——数据类型之Null和Undefined
  • k8s如何管理Pod
  • Redis在Web项目中的应用与实践
  • Spark RDD学习: aggregate函数
  • Vultr 教程目录
  • 关于List、List?、ListObject的区别
  • 记录:CentOS7.2配置LNMP环境记录
  • 经典排序算法及其 Java 实现
  • 深入 Nginx 之配置篇
  • 使用docker-compose进行多节点部署
  • 微信开放平台全网发布【失败】的几点排查方法
  • 源码安装memcached和php memcache扩展
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​2020 年大前端技术趋势解读
  • ![CDATA[ ]] 是什么东东
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #DBA杂记1
  • #pragma data_seg 共享数据区(转)
  • #pragma once
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • #微信小程序:微信小程序常见的配置传值
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (排序详解之 堆排序)
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)JAVA中的堆栈