Java使用反射获取list泛型过程浅析

 更新时间:2023年02月28日 08:45:34   作者:Wis57  
这篇文章主要介绍了Java使用反射获取list泛型过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

通过属性来获取泛型的类型

Field[] fields = bean.getClass().getDeclaredFields();
for(Field f : fields){
	f.setAccessible(true);
	if(f.getType() == java.util.List.class){
		// 如果是List类型,得到其Generic的类型  
		Type genericType = f.getGenericType(); 
		if(genericType == null) continue;  
		// 如果是泛型参数的类型   
		if(genericType instanceof ParameterizedType){   
			ParameterizedType pt = (ParameterizedType) genericType;
			//得到泛型里的class类型对象  
			Class<?> genericClazz = (Class<?>)pt.getActualTypeArguments()[0]; 
		}   
	}

通过class对象来获取泛型类型

Type type = getClass().getGenericSuperclass();
		System.err.println("generic super class type:" + type);
		Type trueType = ((ParameterizedType) type).getActualTypeArguments()[0];
		//trueType就是泛型的真实类型

一、getSuperclass 返回直接继承的父类(由于编译擦除,没有显示泛型参数)

二、getGenericSuperclass 返回直接继承的父类(包含泛型参数)

返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type。

如果超类是参数化类型,则返回的 Type 对象必须准确反映源代码中所使用的实际类型参数。如果以前未曾创建表示超类的参数化类型,则创建这个类型。有关参数化类型创建过程的语义,请参阅 ParameterizedType 声明。

如果此 Class 表示 Object 类、接口、基本类型或 void,则返回 null。

如果此对象表示一个数组类,则返回表示 Object 类的 Class 对象。

列如

package cn.test;
public class Test {
    public static void main(String[] args) {
        System.out.println("Student.class.getSuperclass()\t"                             + Student.class.getSuperclass());
        System.out.println("Student.class.getGenericSuperclass()\t"                            + Student.class.getGenericSuperclass());
        System.out.println("Test.class.getSuperclass()\t"                             + Test.class.getSuperclass());
        System.out.println("Test.class.getGenericSuperclass()\t"                            + Test.class.getGenericSuperclass());
        System.out.println("Object.class.getGenericSuperclass()\t"                             + Object.class.getGenericSuperclass());
        System.out.println("Object.class.getSuperclass()\t"                             + Object.class.getSuperclass());
        System.out.println("void.class.getSuperclass()\t"                             + void.class.getSuperclass());
        System.out.println("void.class.getGenericSuperclass()\t"                             + void.class.getGenericSuperclass());
        System.out.println("int[].class.getSuperclass()\t"                             + int[].class.getSuperclass());
        System.out.println("int[].class.getGenericSuperclass()\t"                             + int[].class.getGenericSuperclass());
    }
}
class Person<T> {
}
class Student extends Person<Test> {
}

输出结果:

Student.class.getSuperclass() class cn.test.Person
Student.class.getGenericSuperclass() cn.test.Person<cn.test.Test>
Test.class.getSuperclass() class java.lang.Object
Test.class.getGenericSuperclass() class java.lang.Object
Object.class.getGenericSuperclass() null
Object.class.getSuperclass() null
void.class.getSuperclass() null
void.class.getGenericSuperclass() null
int[].class.getSuperclass() class java.lang.Object
int[].class.getGenericSuperclass() class java.lang.Object

到此这篇关于Java使用反射获取list泛型过程浅析的文章就介绍到这了,更多相关Java反射获取list泛型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot如何接收前端传来的json数据

    SpringBoot如何接收前端传来的json数据

    这篇文章主要介绍了SpringBoot如何接收前端传来的json数据问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • 详解Spring Cloud中Hystrix的请求合并

    详解Spring Cloud中Hystrix的请求合并

    这篇文章主要介绍了详解Spring Cloud中Hystrix的请求合并,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Java中AIO、BIO、NIO应用场景及区别

    Java中AIO、BIO、NIO应用场景及区别

    本文主要介绍了Java中AIO、BIO、NIO应用场景及区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • MyBatis @Param注解的实现

    MyBatis @Param注解的实现

    本文主要介绍了MyBatis @Param注解的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • 详解springboot项目启动时如何排除用不到的bean

    详解springboot项目启动时如何排除用不到的bean

    使用springboot开发项目,我们有时候会排除一些项目里面用不到的bean,不然的话项目启动会报错,这种情况通常是发生在什么场景里呢,以及如何解决呢,今天咱们就聊一聊
    2024-01-01
  • Java类的定义以及执行顺序学习教程

    Java类的定义以及执行顺序学习教程

    这篇文章主要介绍了Java类的定义以及执行顺序学习教程,包括对象的创建等面向对象编程的基础知识,需要的朋友可以参考下
    2015-09-09
  • SpringBoot中邮件任务的使用

    SpringBoot中邮件任务的使用

    这篇文章主要介绍了SpringBoot中邮件任务的使用,SpringBoot 邮件任务是指使用SpringBoot框架来实现邮件发送和接收的功能,通过SpringBoot的自动配置和简化的开发流程,我们可以轻松地集成邮件功能到我们的应用程序中,需要的朋友可以参考下
    2023-10-10
  • 概述java虚拟机中类的加载器及类加载过程

    概述java虚拟机中类的加载器及类加载过程

    这篇文章主要介绍了概述java虚拟机中类的加载器及类加载过程,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • Java Mybatis框架多表操作与注解开发详解分析

    Java Mybatis框架多表操作与注解开发详解分析

    MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO为数据库中的记录
    2021-10-10
  • Java AWT中常用的三种布局管理器详解

    Java AWT中常用的三种布局管理器详解

    这篇文章主要介绍了Java AWT中常用的三种布局管理器详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12

最新评论