Java反射机制的一个小示例

本文通过一个Java代码示例展示了如何利用反射机制获取泛型类的实际类型参数,详细解释了相关代码步骤,包括获取类的继承信息、泛型超类、实际类型参数及其名称。内容适合Java初学者及开发者深入了解反射与泛型的结合使用。

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

目录结构
在这里插入图片描述

User

package com.xiao.entity;

/**
 * @author 
 * @version 1.0
 * @date 5/8/2022 12:56 PM
 */
public class User {
}

父类

package com.xiao;

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

/**
 * @author 
 * @version 1.0
 * @date 4/23/2022 11:24 PM
 */
public class T1 <T>{
    public T1() {
       /*
       //获取继承了类
        Class<? extends T1> aClass = getClass();
        System.out.println("getClass():"+aClass);
        //得到基础类的通用的超类
        Type genericSuperclass = getClass().getGenericSuperclass();
        System.out.println("genericSuperclass: "+ genericSuperclass);
        //参数化
        ParameterizedType genericSuperclass1 = (ParameterizedType) getClass().getGenericSuperclass();
        System.out.println("genericSuperclass1: "+genericSuperclass1);
        //实际的类型参数
        Type actualTypeArgument = ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        System.out.println("actualTypeArgument: "+actualTypeArgument);
        //反射机制,反射什么啥?
        Class<T> actualTypeArgument1 = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        System.out.println("actualTypeArgument1: " +actualTypeArgument1);
        //获取简单名称,相对于前面的几个步骤
        String simpleName = ((Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]).getSimpleName();
        System.out.println("simpleName: " + simpleName);*/

        //获取继承类,getClass():class com.xiao.T2
        Class<? extends T1> aClass = getClass();
        System.out.println("getClass():"+aClass);
        //获取被继承类,genericSuperclass: com.xiao.T1<com.xiao.entity.User>
        Type genericSuperclass = aClass.getGenericSuperclass();
        System.out.println("genericSuperclass: "+ genericSuperclass);
        //参数化 ,我目前看不出来发生了什么变化g enericSuperclass1: com.xiao.T1<com.xiao.entity.User>
        ParameterizedType genericSuperclass1 = (ParameterizedType) genericSuperclass;
        System.out.println("参数化 genericSuperclass1: "+genericSuperclass1);
        //获取超级类的实际类型参数 actualTypeArgument: class com.xiao.entity.User
        Type actualTypeArgument = genericSuperclass1.getActualTypeArguments()[0];
        System.out.println("actualTypeArgument: "+ actualTypeArgument);
        //如果没有反射机制,就没法获取实际类型参数的名称了
        /*
        反射机制
            在运行状态中。
            对于任意一个类,都能够知道这个类的所有的属性和方法;
            对于任意一个对象,都能够调用它的任意一个方法和属性;
            这种动态获取的信息以及动态调用对象的方法的功能就是反射机制。
        * */
        String typeName = actualTypeArgument.getTypeName();
        System.out.println("typeName: "+typeName);
        String s = actualTypeArgument.toString();
        System.out.println("s:" + s);
        Class<? extends Type> aClass1 = actualTypeArgument.getClass();
        System.out.println("aClass1: " + aClass1);
        //反射机制 actualTypeArgument1: class com.xiao.entity.User
        Class<T> actualTypeArgument1 = (Class<T>) actualTypeArgument;
        System.out.println("actualTypeArgument1: "+ actualTypeArgument1);
        Class<? extends Class> actualTypeArgument1Class = actualTypeArgument1.getClass();
        System.out.println("actualTypeArgument1Class: " + actualTypeArgument1Class);
        //获取名称
        String simpleName = actualTypeArgument1.getSimpleName();
        System.out.println("simpleName: "+simpleName);

    }
}

子类

package com.xiao;

import com.xiao.entity.User;

/**
 * @author 
 * @version 1.0
 * @date 4/23/2022 11:26 PM
 */
public class T2<T> extends T1<User> {
    public static void main(String[] args) {
        T2 t = new T2();
    }
}

祝你好运!

希望能帮你理解些!注释的内容可以不用看,本人随便写的个人感受。
下面部分的内容不用看了!!!!
下面部分的内容不用看了!!!!

有些说法可能不太合理,希望多多参考,我也是今天开始了解这个java反射机制。之前,老师也有将,没怎么用?所以没怎么了解,等真正需要的时候才肯去学,肯了解。多看看有些的开源项目,拿来学学?多上网搜搜,我这个也是参考别人的代码,让后试着去理解,并标记,我的方法可能有误,当然,目前本人根据自己还是这个行业的门外汉。哎!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值