随笔 - 832  文章 - 2  评论 - 31  阅读 - 167万

Java反射之getGenericSuperclass()用法

父类

package com.itheima.mytest;

public class Person<T1, T2> {

}

子类

复制代码
package com.itheima.mytest;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public class Student extends Person<Integer, String> {

    @SuppressWarnings("rawtypes")
    public static void main(String[] args) {
        Student student = new Student();
        // getClass() 获得该类的类类型(即类型变量)
        Class clazz = student.getClass();
        // getSuperclass() 获得该类的父类
        System.out.println(clazz.getSuperclass());

        // getGenericSuperclass() 获得该类带有泛型的父类
        Type type = clazz.getGenericSuperclass();
        System.out.println(type);
        // Type是 Java 编程语言中所有类型的公共高级接口。它们包括原始类型、参数化类型、数组类型、类型变量和基本类型。

        // ParameterizedType 参数化类型,即泛型
        // 将Type转化为参数化类型(即泛型)
        ParameterizedType p = (ParameterizedType) type;

        // getActualTypeArguments() 获取参数化类型的数组,泛型可能有多个
        Type[] actualTypeArguments = p.getActualTypeArguments();

        // 将Type转化为类型变量(即Class)
        Class c1 = (Class) actualTypeArguments[0];
        Class c2 = (Class) actualTypeArguments[1];
        System.out.println(c1);
        System.out.println(c2);
    }
}

运行结果
复制代码
class com.itheima.mytest.Person
com.itheima.mytest.Person<java.lang.Integer, java.lang.String>
class java.lang.Integer
class java.lang.String

使用:

复制代码
/**
 * 
 */
package com.idea.utils;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * 泛型工具
 * 
 * @author zhailiang
 *
 */
public class GenericUtils {

    /**
     * 获取目标class的第一个泛型参数的类型
     * 
     * @param clazz
     * @return
     */
    @SuppressWarnings("rawtypes")
    public static Class getGenericClass(Class clazz) {
        return getGenericClass(clazz, 0);
    }

    /**
     * 获取目标class的指定位置的泛型参数的类型
     * 
     * @param clazz
     * @param index
     *            泛型参数的位置,第一个参数为0
     * @return
     */
    @SuppressWarnings("rawtypes")
    public static Class getGenericClass(Class clazz, int index) {
        Type t = clazz.getGenericSuperclass();
        if (t instanceof ParameterizedType) {
            Type[] params = ((ParameterizedType) t).getActualTypeArguments();
            return (Class) params[index];
        }
        throw new RuntimeException("无法获得泛型的类型");
    }

}
复制代码

 ClassUtils.isAssignable:是否可以转成某个类型

问题:某个方法 返回值是类型Object,但是实际上返回值 可能是List<Map> 或者是 Map(也就是返回一条还是多条Map),需要判断返回值是不是List,否则不能直接遍历;

解决办法:

  • 工具类:ClassUtils
  • 方法:isAssignable
    • 参数1:Class<?> lhsType
    • 参数2:Class<?> rhsType
  • 简单理解:
    • 参数1为 目标类型;
    • 参数2为 不确定类型;
    • 根据返回值 true/false来判断 rhsType 是不是 lhsType

补充:Assignable,可分配的,可转让的;

posted on   小破孩楼主  阅读(553)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示