通过反射获取继承或接口的泛型Class对象

使用反射获取泛型Class对象
本文介绍了如何通过反射技术获取继承或接口的泛型Class对象。包括获取父类和接口泛型对象的两种方法,并提供了演示代码作为示例。

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{
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值