我在最近的开发中遇到这样一种情形,就是有一个类需要使用泛型进行实现,但是又同时需要用到泛型的Class对象。然而由于Java泛型擦除没办法直接得到泛型参数的Class对象。本已打算放弃,但是在编写其它代码的过程中,无意间从jackson的TypeReference文件得到线索。找到了通过泛型类的特化子类获得泛型参数类型Class的方法。通过代码和注释示例如下:

package com.tools;import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;/*** 关于方法ParameterizedType.getActualTypeArguments()的使用:* 1、继承泛型类(包括抽象类和实体类)产生子类,并且必须指定实际泛型参数,也就是产生一个特化子类。* 2、对于该特化子类其泛型父类其实是一个参数化后的特化类,可通过调用该特化子类的Class对象*    的getGenericSuperclass()方法得到其参数化父类。得到一个ParameterizedType对象。之后即可通*    过调用其参数化父类对象的ParameterizedType.getActualTypeArguments()得到实际的类型参数并可*    转换为类型参数的Class对象。* 3、假设出于接口统一等目的,在泛型类当中编写了一个方法用于获取泛型参数的Class对象,并在该方法里*    调用了getActualTypeArguments()方法。那么这样编写是没有问题的。但是不能对该泛型类的直接实例*    化对象调用该方法,但可以对该泛型类的特化子类实例化对象调用该方法。这是因为只有该泛型类的特化*    子类才有参数化泛型父类。* 4、泛型接口GenericInterface的泛型参数Class对象也可以通过类似的方法得到。因为他们的产生原理都是*    类似的。所以也可在特化子类的Class对象调用getGenericInterfaces()得到参数化泛型接口对象。* 5、所有内容是从Jackson-core版本2.5.3的类com.fasterxml.jackson.core.type.TypeReference<T>获得。**/
public class GenericParameterTest {public static void main(String[] args) {// TODO Auto-generated method stub//1、泛型类的直接实例化对象,不能调用getType(),即使是带参实例化。A<String> a=new A<String>();try{System.out.println(a.getType());}catch(Throwable e){System.out.println("泛型类直接实例化对象调用时会爆异常");}//2、泛型类的子类实例化对象,可以调用getType(),即使是通过匿名内部类产生的子类对象。A<String> a1=new A<String>() {   };  System.out.println("子类实例化外部调用:"+a1.getType());//3、子类内部也是可以调用的new A<String>(){void fuck() {//在子类的方法中调用也可以获得typeSystem.out.println("子类内部:"+getType());}}.fuck();}class A<T> {Class<T> getType() {Type superClass = getClass().getGenericSuperclass();return (Class<T>) ((ParameterizedType) superClass).getActualTypeArguments()[0];}
}

JAVA一种获得泛型类泛型参数Class对象的方法相关推荐

  1. java反射 int_java反射如何调用参数为int的方法?

    代码如下,会发生java.lang.NoSuchMethodException异常. import java.lang.reflect.Field; import java.lang.reflect. ...

  2. Java两种简单的获取页面源码的方法

    2019独角兽企业重金招聘Python工程师标准>>> package demo11;import java.io.IOException; import java.net.Malf ...

  3. 在Java中,采用类的默认构造函数构造对象的方法!

    示例代码如下: URL pageURL = new URL(path); 其中URL是一个类,pageURL是对象!

  4. java猫抓老鼠_用猫抓老鼠的实例理解java中面向对象的编程与类和对象以及方法的概念...

    今天看到马士兵讲的关于面向对象编程的思路,用了一个猫抓老鼠的例子,我觉得这个例子非常形象,于是写在这里,方便学习理解和以后查看 class cat{ //声明一个类–"猫" int ...

  5. JAVA入门第二季 第一章 类和对象

    面向对象编程 Object Oriented Programming OOP 第一.什么是类和对象 在具体说明类和对象之前,先说说别的. 眼睛在人类身体上最为有用的器官.如果一个没有了眼睛,这个人与世 ...

  6. java 泛型参数_[基础]-Java泛型

    一.概述 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型. 泛型的本质是参数化类型,也就是说所操作的 ...

  7. [转载] Java获取一个类继承的父类或者实现的接口的泛型参数

    参考链接: Java中的接口和继承 泛型的作用就不多介绍了,如果你想具备架构设计能力,那么熟练使用泛型是必不可少的. 不多说了,先定义泛型父类和泛型接口: package cn.zhh; public ...

  8. Java反射--获取类方法的泛型返回或泛型参数

    Java反射--获取类方法的泛型返回或泛型参数 一.测试类 public class Test02 {public void parameterTest(Map<Integer, Dog> ...

  9. Java泛型之泛型参数

    在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,更多Java专业知识,广州疯狂java培训为你讲解; 泛型机制常用的参数有3个: & ...

最新文章

  1. java学习之成员内部类
  2. apache性能测试工具ab使用详解
  3. GEB:南土所梁玉婷组-大陆尺度下稻田土壤微生物β多样性的纬度分布特征
  4. 服务器搬迁之后的准备工作和应对
  5. 【LSTM】基于LSTM网络的人脸识别算法的MATLAB仿真
  6. 无影云电脑居家办公最佳实践(便捷账号)
  7. FFMPEG结构体分析之AVCodecContext
  8. java标签用法详解_介绍一个javaWeb自定义标签的用法详解
  9. diy直立双足机器人_Aelos Pro 机器人:让编程变得更有趣
  10. java中asl_带你认识绕不开的ASLR
  11. 《云云众声》第95期:业界大事接着看 HP成功收购Aruba;IBM战略变动 前景发展被看好...
  12. 多点触摸与单点触摸接口主要区别【转】
  13. Android版式– LinearLayout,RelativeLayout
  14. ubuntu LVM
  15. MedPy医学图像评价的python库
  16. can bus测试工具
  17. ApacheCN 翻译/校对/笔记整理活动进度公告 2019.10.18
  18. 计算机键盘能直接接手机吗,手机变电脑!智能手机外接键盘和鼠标的3种方法...
  19. 如何修改命令提示符(cmd)的颜色?
  20. 开头的单词_c开头的英语单词三年级到六年级的英语单词记忆

热门文章

  1. 2021金九银十面试讴歌系列,Android面试不可不看的经验,android网络层框架设计实战
  2. C++报错signal SIGSEGV, Segmentation fault
  3. 2022 新春快乐,万事顺心!
  4. 21.敏捷项目管理流程实例 - 敏捷成熟度评估
  5. 要求输入一个企业员工的姓名,性别,工号,月基本工资,奖金补贴后,计算个人所得税。系统输出员工姓名,性别,工号,和月应发薪水和实发薪水(月应发薪水-个人所得税)
  6. 奥特曼打小怪兽,赢了的和boss打
  7. vue3.0(第九篇)vue3.0可用的组件库
  8. java args用法_Java中args参数数组的用法说明代码
  9. 【高通SIM卡】 单卡配置
  10. 2.2计算圆柱体的体积