文档章节

获取java泛型真实类型的方式

旺仔没馒头
 旺仔没馒头
发布于 01/22 11:09
字数 500
阅读 59
收藏 3

获取java泛型真实类型的方式

获取泛型的真实类型,分为以下两种形式:

1、获取类的泛型的真实类型

假设,我们有一个Generic<T>类和Main

class Generic<T> {

}
public class Main extends Generic<String> {

}

如何在Main类中获取到父类泛型的实际类型呢?

可以通过如下方式获取:

class Generic<T> {

}

public class Main extends Generic<String> {

    public static void main(String[] args) {
        // 具体参数类型
        Main testClass = new Main();
        System.out.println(getGenericType(testClass.getClass()));
    }
    /**
     * 获取所继承类的泛型实际类型
     *
     * @param declaredClass 传入Class实例
     * @return 泛型实际类型
     */
    private static Class getGenericType(Class declaredClass) {
        ParameterizedType parameterizedType = (ParameterizedType) declaredClass.getGenericSuperclass();
        Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
        return (Class) actualTypeArguments[0];
    }

}

还有另一种情况,我们有一个Person<T>

public class Person<T> {

}

如何获取到当前类上的泛型呢?

可以通过如下方式获取到定义在类上的泛型名称,下面代码会打印出T。

public class Person<T> {

    public static void main(String[] args){
        TypeVariable[] parameters = Person.class.getTypeParameters();
        for (TypeVariable typeVariable : parameters) {
            System.out.println(typeVariable);
        }
    }

}

但是,我们要获取像下面代码中的泛型,暂时没有找到解决方案

Person<String> person = new Person<>();

不过,通过查看编译后的字节码文件,发现类型信息保留在字节码中,可以通过字节码反推的形式获取到,那就很复杂了。

2、获取类字段上泛型的真实类型

对于在字段上,复杂形式的泛型,我们可以通过Spring-core中的ResolvableType类帮助我们解析。

public class Main {

    private List<Map<String, List<Object>>> list = new ArrayList<>();

    public static void main(String[] args) throws NoSuchFieldException {
        // 获取成员泛型参数类型
        Field field = Main.class.getDeclaredField("list");
        ResolvableType resolvableType = ResolvableType.forField(field);
        System.out.println(resolvableType.getGeneric(0));
    }

}

具体使用可以查看ResolvableType源码中的示例。

© 著作权归作者所有

旺仔没馒头

旺仔没馒头

粉丝 3
博文 24
码字总数 20054
作品 0
济南
程序员
私信 提问
Spring 中好用的泛型操作API

随着泛型用的越来越多,获取泛型实际类型信息的需求也会出现,如果用原生API,需要很多步操作才能获取到泛型,比如: ParameterizedType parameterizedType = (ParameterizedType) ABServic...

宇的季节
2018/06/06
0
0
用JS角度看Java,关于数组

很长时间没来简书了,说不上忙,却也不想写东西,不想学习; 只是最近突发奇想,想用java实现js数组——及用一个List对象去储存各种各样类型的数据。js是弱类型语言,其灵活的语法给开发带来...

扶摇十万里
2018/11/09
0
0
Kotlin 泛型 VS Java 泛型

建议先阅读我的上一篇文章 -- Java 泛型 和 Java 泛型一样,Kotlin 泛型也是 Kotlin 语言中较难理解的一个部分。Kotlin 泛型的本质也是参数化类型,并且提供了编译时强类型检查,实际上也是伪...

JohnnyShieh
2018/06/11
0
0
【转】Java语法糖的味道:泛型与类型擦除

泛型是JDK 1.5的一项新特性,它的本质是参数化类型(Parameterized Type)的应用,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类...

mj4738
2011/11/29
318
0
《JAVA核心知识》学习笔记(5. JAVA 基础)-4

5.1.1. JAVA 异常分类及处理 5.1.1.1. 概念 如果某个方法不能按照正常的途径完成任务,就可以通过另一种路径退出方法。在这种情况下 会抛出一个封装了错误信息的对象。此时,这个方法会立刻退...

Shingfi
09/10
20
0

没有更多内容

加载失败,请刷新页面

加载更多

JS--function

一、声明提前(hoist) 在js程序开始执行前,引擎会查找所有var声明的变量和function声明的函数,集中到当前作用域顶部集中创建,赋值留在原地 二、三种创建函数的方式 1、声明方式创建函数-...

wytao1995
今天
4
0
微服务之间调用控制器注解类型的差异

今天在一个业务服务通过Feign调用文件服务上传文件时遇到了几个问题: 1. 提示http请求头过大的问题; 此时需要修改bootstrap.yml,加入 server: max-http-header-size: 10000000 用以放大...

不再熬夜
今天
7
0
用 4G 工作是什么体验

七月开始,因为工作原因,在公司附近租了个住处,方便工作。离公司近了,感觉就是不一样,之前每天 5:30 就要起床赶地铁,现在可以睡到自然醒,一看才 7 点,悠闲的起床洗漱,踱步到公司,都...

zzxworld
今天
6
0
sonar报错volatile

问题发生 原先代码如下: //认证授权码private static volatile String AUTHORIZATION_CODE = "init"; git push 之后,sonar认为这是个bug检测报告截图如下: 分析排查 解释说明: Markin...

开源小菜鸟2333
今天
5
0
《Java实践指南》--读后

闲读《Java实践指南》... 1.lvy 某些项目中能够看到ivy.xml。早期使用ant的项目中,常常用ivy.xml来下载项目依赖。 2.ant 作为java程序员,应该都知道ant,虽然可能用过的人不多。为什么ant...

RippleChan
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部