[转载] Java获取泛型T的类型 T.class
参考链接: Java中的抽象
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class Main{
public static void main(String[] args)
{
Foo<String> foo = new Foo<String>(){};
// 在类的外部这样获取
Type type = ((ParameterizedType)foo.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
System.out.println(type);
// 在类的内部这样获取
System.out.println(foo.getTClass());
}
}
abstract class Foo<T>{
public Class<T> getTClass()
{
Class<T> tClass = (Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
return tClass;
}
}
输出:
class java.lang.String
class java.lang.String
上面的代码不是万能的,只有实例化T的子类才能按上述方法获得T的实际类型, 如果子类没有实例化T,则无法获取T的实际类型; 比如,class Child 并没有实例化T,所以得不到String.class;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class Main{
public static void main(String[] args){
//区别在new Child<String>()没有{}匿名类
Foo<String> foo = new Child<String>();
// 在类的外部这样获取
Type type = ((ParameterizedType)foo.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
System.out.println(type);
// 在类的内部这样获取
System.out.println(foo.getTClass());
}
}
abstract class Foo<T>{
public Class<T> getTClass()
{
Class<T> tClass = (Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
return tClass;
}
}
class Child<T> extends Foo<T>{
}
输出:
Exception in thread "main" java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
at com.hankcs.Main.main(Main.java:9)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
有一种解决方式,父类本身不获取泛型的具体类型,仅提供抽象方法,由子类来提供具体的类型
public abstract class Foo<T> {
public abstract Class getEntityClass();
}
public class Child extends Foo<String> {
public Class getEntityClass() {
return String.class;
}
}
对于获取泛型的方法,比较完整的代码如下:
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class GenericsUtils {
/**
* 通过反射,获得定义Class时声明的父类的范型参数的类型. 如public BookManager extends
* GenricManager<Book>
*
* @param clazz The class to introspect
* @return the first generic declaration, or <code>Object.class</code> if cannot be determined
*/
public static Class getSuperClassGenricType(Class clazz) {
return getSuperClassGenricType(clazz, 0);
}
/**
* 通过反射,获得定义Class时声明的父类的范型参数的类型. 如public BookManager extends GenricManager<Book>
*
* @param clazz clazz The class to introspect
* @param index the Index of the generic ddeclaration,start from 0.
*/
public static Class getSuperClassGenricType(Class clazz, int index)
throws IndexOutOfBoundsException {
Type genType = clazz.getGenericSuperclass();
if (!(genType instanceof ParameterizedType)) {
return Object.class;
}
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
if (index >= params.length || index < 0) {
return Object.class;
}
if (!(params[index] instanceof Class)) {
return Object.class;
}
return (Class) params[index];
}
}
转载来源: http://blog.csdn.net/wangjunjun2008/article/details/43970217 http://www.hankcs.com/program/t-class.html https://www.cnblogs.com/sirab415/p/6133533.html
[转载] Java获取泛型T的类型 T.class相关推荐
- Java获取泛型T的类型 T.class
import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type;public class Main{public s ...
- 【转】Java获取泛型T的具体类型
在日常的开发中特别是框架的设计或者实用反射的时候,经常会实用class类去做一些事情,但是由于系统的抽象等问题,经常实用泛型去做一些事情.所以如何在泛型中获取具体的class类呢? 解决方案:父类本身 ...
- Java通过泛型的模板类型实例化对象
Java通过泛型的模板类型实例化对象 最近自己研究了下mvvm框架,使用泛型的方式可节省很多代码,并且可以合并很多冗余代码,为了最大化的精简代码想到了通过泛型的type用反射的方式实例化对象,这样对象 ...
- java 获取泛型的type,如何获取泛型的Type类型
开发中很多时候都遇到或使用到泛型.例如在json转换成bean对象或其他对象,而对象中存在泛型,这时候需要用到TypeToken. Type:是java里的 java.lang.reflect.Typ ...
- java获取泛型的类型_Java反射获取泛型类型
public class Person{ }importjava.lang.reflect.ParameterizedType;importjava.lang.reflect.Type;public ...
- java 获取泛型_聊聊Java泛型擦除那些事
>版权申明]非商业目的注明出处可自由转载 博文地址:https://blog.csdn.net/ShuSheng0007/article/details/89789849 出自:shushen ...
- java 获取泛型t的class_阿里巴巴都鼎力推荐的java基础之集合其他内容和泛型3
第三节 泛型 3.1为什么需要泛型 没有采用泛型之前 1.不安全:添加元素是无检查 宽进 2.繁琐:获取元素时需要强制类型转换 严出 采用泛型之后 1.安全 严进 2.简单 宽出 3.2什么是泛型ge ...
- java 获取子类实际的类型名_Java 泛型类 以及 泛型类获取子类的具体参数类型 以及 获取子类型具体参数的实例...
前言: 要点都在代码注释中 1.泛型类 GenericInterface package com.demo.generic; import java.lang.reflect.Parameterize ...
- java 获取泛型的属性_java在泛型类 T 上利用反射取属性值
记录一次反射的使用,第一次真正运用到实际工作中,发现反射是真的强大! 写了一个通用类,主要是便于和 db 的交互操作,使用到了泛型 T 对象,但是有一步需要获取该对象的属性 id 值(前提是所有赋值给 ...
最新文章
- Go 学习笔记(30)— Go 语言 make 和 new 的区别
- %matplotlib inline的含义
- D3D9学习笔记(四) 绘制
- Myeclipse中导入项目后java类中汉字注释出现乱码问题(已解决)
- web项目html页面过多,详解webpack4多入口、多页面项目构建案例
- Dell 笔记本的 BIOS设置 USB Wake Support 的设置
- flask需求文件requirements.txt的创建及使用
- 苹果被咬一大口!高通获得45亿美元和解金 下一个目标是华为?
- xp系统打开计算机配置文件,浅析xp系统如何解决开机出现“Windows不能加载本地存储的配置文件“...
- C++ mutable 的用法
- matlab邻域平均,数字图像处理邻域平均法滤波实验报告matlab实现
- NOIP2016DAY1题解
- Quartz.net 任务调度
- 【Linux】修改镜像源
- 华为摄像头搜索软件_ZOOM会议软件简要操作说明-安卓手机版
- 免费PBootCMS采集支持聚合文章采集插件
- GEE(Python)逐像元线性拟合
- window自带的桌面整理工具
- qt5.9开发指南 例子
- 原因: java.lang.NoClassDefFoundError: helloworld/Helloworld (wrong name: Helloworld)
热门文章
- Windows 10环境下AndroidStudio安装教程(内含如何配置Http Proxy)
- kafka告警简单方案
- 使用 PyTorch 数据读取,JAX 框架来训练一个简单的神经网络
- 计算机组成原理单周期mips,计算机组成原理CPU单周期数据通路(MIPS)
- c语言 socket 报文解析,C语言实现Socket简单通信
- datagrid wpf 获取选中_c# WPF DataGrid 获取选中单元格信息
- mysql index sub part_mysql中的key和index 理解
- MyBatis的逆向工程工具,自动生成数据库对应的POJO实体类、mapper接口、增删改查mapper.xml文件
- asp.net core输出中文乱码的问题
- 搭建网站必不可少的知识14