温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java如何使用反射获取list泛型

发布时间:2023-02-28 10:07:39 来源:亿速云 阅读:162 作者:iii 栏目:开发技术

这篇文章主要介绍“Java如何使用反射获取list泛型”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“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泛型”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI