关于Java如何读取泛型类型参数

本文介绍了如何利用Java反射机制获取泛型类型信息,并通过两个示例详细展示了具体操作过程。首先介绍了如何获取Map泛型参数的具体类型,其次展示了一个抽象类如何通过反射确定其泛型参数的实际类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般使用反射来获取泛型类型信息
如下代码:

package myGenetic;

import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Map;

public class GenericTest {
/*使用反射来获取泛型信息*/
private Map<String, Integer> score;
public static void main(String[] args) throws SecurityException, NoSuchFieldException {
//Class clazz = GenericTest.class;
Class<GenericTest> clazz = GenericTest.class;
//System.out.println(clazz);
Field f = clazz.getDeclaredField("score");

//直接使用getType只对普通类型有效,无法取到泛型参数
Class<?> a = f.getType();
System.out.println("score的类型是:"+a);

//获得Field实例f的泛型类型
Type gType = f.getGenericType();
//如果gType类型是ParameterizedType的对象
if (gType instanceof ParameterizedType) {
ParameterizedType pType = (ParameterizedType) gType;
//获取原始类型
Type rType = pType.getRawType();
System.out.println("原始类型是:"+rType);
//取得泛型类型参数
Type[] tArgs = pType.getActualTypeArguments();
System.out.println("泛型类型是:");
for (int i = 0; i < tArgs.length; i++) {
System.out.println("第"+i+"个泛型类型是:"+tArgs[i]);
}
}else{
System.out.println("获取泛型类型出错!");
}
}
}


输出结果如下:
[b]score的类型是:interface java.util.Map
原始类型是:interface java.util.Map
泛型类型是:
第0个泛型类型是:class java.lang.String
第1个泛型类型是:class java.lang.Integer[/b]

还有一个较好的例子,多用于实现BaseDAO,代码如下:

package myGenetic;

import java.lang.reflect.ParameterizedType;

class SubClass extends SuperClass<Person> {

public SubClass() {
super();
}

}

class Person {
public Person() {
super();
}

public void function() {
System.out.println("function in Person.class...");
}
}


public abstract class SuperClass<T> {
private Class<T> clazz;

@SuppressWarnings("unchecked")
public SuperClass() {
clazz = (Class<T>) ((ParameterizedType) super.getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
}

public Class<T> getClazz() {
return clazz;
}

public void setClazz(Class<T> clazz) {
this.clazz = clazz;
}

/**
* 普通的非泛型类Class
* 泛型化的类Class<T>
* JDK中,普通的Class.newInstance()方法的定义返回Object,要将该返回类型强制转换为另一种类型;
* 但是使用泛型的Class<T>,Class.newInstance()方法具有一个特定的返回类型;
* @param args
*/
public static void main(String[] args) {
SuperClass<Person> subClass = new SubClass();
//1.得到泛型类T实际的完整类名
System.out.println(subClass.getClazz());
//2.得到泛型类T的对象
try {
System.out.println(subClass.getClazz().newInstance());
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
//3.调用泛型类T的方法
try {
subClass.getClazz().newInstance().function();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}


输出结果如下:
[b]class myGenetic.Person
myGenetic.Person@10d448
function in Person.class...[/b]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值