1 通过反射获取继承或接口的泛型Class对象
1.2 泛型获取的简介
- 有时候我们知道泛型类型,但是由于不知道该泛型的具体类型,他本身就是抽象的,所以我们获取不到泛型的Class对象,所以我们可以通过反射技术来获取泛型的Class对象
- 分为两种
- 一种获取继承的父类的泛型对象
- Class getAbstActualType(Object obj)方法演示
- 一种获取实现父接口的泛型对象
- Class getInterActualType(Object obj)方法演示
1.3演示代码
package com.zgd.learn.crm.test;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
/**
* 测试通过反射技术获取泛型的Class对象
*/
public class TypeTest
{
public static void main(String[] args)
{
B b=new B(); // B有一个继承父类A,A有泛型参数C
Class clazz1=getAbstActualType(b);
System.out.println(clazz1);// class com.zgd.learn.crm.test.C
X x=new X();// X有一个接口父类Y,Y有泛型参数Z
Class clazz2=getInterActualType(x);
System.out.println(clazz2);// class com.zgd.learn.crm.test.Z
}
/**
* 获取继承父类的泛型Class对象
* @Description: abstTypeTest
*/
public static Class getAbstActualType(Object obj)
{
// 获取实例对象的抽象父类
Type superclass = obj.getClass().getGenericSuperclass();
// 转化抽象父类为参数类
ParameterizedType pType=(ParameterizedType) superclass;
// 获取参数类的泛型类型数组
Type[] types = pType.getActualTypeArguments();
// 因为我们抽象类中泛型参数只有一个,所以泛型类型数组第一个就是我们的泛型类型,Class是Type的子类
Class clazz=(Class) types[0];
return clazz;
}
/**
* 获取接口父类的泛型对象
* @Description: interTypeTest
*/
public static Class getInterActualType(Object obj)
{
// 获取实例对象父接口
Type[] interTypes = obj.getClass().getGenericInterfaces();
// 转化抽象父类为参数类,因为这里我们只有一个父接口,所以下表0位我们需要的
ParameterizedType pType=(ParameterizedType) interTypes[0];
// 获取父接口的参数类型数组
Type[] types = pType.getActualTypeArguments();
// 因为我们父接口中泛型参数只有一个,所以泛型类型数组第一个就是我们的泛型类型,Class是Type的子类
Class clazz=(Class) types[0];
return clazz;
}
}
class A<C>{
}
class B extends A<C>{
}
class C{
}
interface Y<Z>{
}
class X implements Y<Z>{
}
class Z{
}