参考链接: 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相关推荐

  1. Java获取泛型T的类型 T.class

    import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type;public class Main{public s ...

  2. 【转】Java获取泛型T的具体类型

    在日常的开发中特别是框架的设计或者实用反射的时候,经常会实用class类去做一些事情,但是由于系统的抽象等问题,经常实用泛型去做一些事情.所以如何在泛型中获取具体的class类呢? 解决方案:父类本身 ...

  3. Java通过泛型的模板类型实例化对象

    Java通过泛型的模板类型实例化对象 最近自己研究了下mvvm框架,使用泛型的方式可节省很多代码,并且可以合并很多冗余代码,为了最大化的精简代码想到了通过泛型的type用反射的方式实例化对象,这样对象 ...

  4. java 获取泛型的type,如何获取泛型的Type类型

    开发中很多时候都遇到或使用到泛型.例如在json转换成bean对象或其他对象,而对象中存在泛型,这时候需要用到TypeToken. Type:是java里的 java.lang.reflect.Typ ...

  5. java获取泛型的类型_Java反射获取泛型类型

    public class Person{ }importjava.lang.reflect.ParameterizedType;importjava.lang.reflect.Type;public ...

  6. java 获取泛型_聊聊Java泛型擦除那些事

    >版权申明]非商业目的注明出处可自由转载 博文地址:https://blog.csdn.net/ShuSheng0007/article/details/89789849 出自:shushen ...

  7. java 获取泛型t的class_阿里巴巴都鼎力推荐的java基础之集合其他内容和泛型3

    第三节 泛型 3.1为什么需要泛型 没有采用泛型之前 1.不安全:添加元素是无检查 宽进 2.繁琐:获取元素时需要强制类型转换 严出 采用泛型之后 1.安全 严进 2.简单 宽出 3.2什么是泛型ge ...

  8. java 获取子类实际的类型名_Java 泛型类 以及 泛型类获取子类的具体参数类型 以及 获取子类型具体参数的实例...

    前言: 要点都在代码注释中 1.泛型类 GenericInterface package com.demo.generic; import java.lang.reflect.Parameterize ...

  9. java 获取泛型的属性_java在泛型类 T 上利用反射取属性值

    记录一次反射的使用,第一次真正运用到实际工作中,发现反射是真的强大! 写了一个通用类,主要是便于和 db 的交互操作,使用到了泛型 T 对象,但是有一步需要获取该对象的属性 id 值(前提是所有赋值给 ...

最新文章

  1. Go 学习笔记(30)— Go 语言 make 和 new 的区别
  2. %matplotlib inline的含义
  3. D3D9学习笔记(四) 绘制
  4. Myeclipse中导入项目后java类中汉字注释出现乱码问题(已解决)
  5. web项目html页面过多,详解webpack4多入口、多页面项目构建案例
  6. Dell 笔记本的 BIOS设置 USB Wake Support 的设置
  7. flask需求文件requirements.txt的创建及使用
  8. 苹果被咬一大口!高通获得45亿美元和解金 下一个目标是华为?
  9. xp系统打开计算机配置文件,浅析xp系统如何解决开机出现“Windows不能加载本地存储的配置文件“...
  10. C++ mutable 的用法
  11. matlab邻域平均,数字图像处理邻域平均法滤波实验报告matlab实现
  12. NOIP2016DAY1题解
  13. Quartz.net 任务调度
  14. 【Linux】修改镜像源
  15. 华为摄像头搜索软件_ZOOM会议软件简要操作说明-安卓手机版
  16. 免费PBootCMS采集支持聚合文章采集插件
  17. GEE(Python)逐像元线性拟合
  18. window自带的桌面整理工具
  19. qt5.9开发指南 例子
  20. 原因: java.lang.NoClassDefFoundError: helloworld/Helloworld (wrong name: Helloworld)

热门文章

  1. Windows 10环境下AndroidStudio安装教程(内含如何配置Http Proxy)
  2. kafka告警简单方案
  3. 使用 PyTorch 数据读取,JAX 框架来训练一个简单的神经网络
  4. 计算机组成原理单周期mips,计算机组成原理CPU单周期数据通路(MIPS)
  5. c语言 socket 报文解析,C语言实现Socket简单通信
  6. datagrid wpf 获取选中_c# WPF DataGrid 获取选中单元格信息
  7. mysql index sub part_mysql中的key和index 理解
  8. MyBatis的逆向工程工具,自动生成数据库对应的POJO实体类、mapper接口、增删改查mapper.xml文件
  9. asp.net core输出中文乱码的问题
  10. 搭建网站必不可少的知识14