旧事重提--反射应用

一、 类

1. 泛型实例

(1) 新建含泛型的类:
在这里插入图片描述

Ps:T表示泛型,是一个占位符,表示任意类型,也可以表示为S、Y、K、M、A等任意字符。在实例化该类时再制定具体类型。【与<?>的区别见拓展1】

(2) 实例化该类:
在这里插入图片描述

Ps:注意实例化语句的后半部分,“<>”内需要指定具体Class或Object类型,并配上花括号“{}”(具体原因待探究)。

(3) 获取超类类型:

利用反射(java.lang.reflect)机制,使用getGenericSuperclass()返回此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type。
在这里插入图片描述
*getGenericSuperclass()返回的三个示例:
a. Map<String, Object>
在这里插入图片描述
输出:
在这里插入图片描述

b. List
在这里插入图片描述
c. 类
在这里插入图片描述
输出:
在这里插入图片描述

(4) 获取参数化类型:

使用ParameterizedType获取类中的所有参数化类型(如(3)中第1张图)(前提:超类是参数化类型)

使用getActualTypeArguments将pt获取到的参数化类型进行解析,得到的所有泛型的实际实现类型按顺序插入到一个Type类型数组中,取用时按顺序取用即可,下面是类中只包含一个泛型的例子:
在这里插入图片描述
输出:
在这里插入图片描述

2. 泛型的实例化

上代码解析:

// 这里只说明泛型实际类型为类时的实例化
if ( type instanceof Class ) {
    // Type强转Class,获得T的实际class
    Class<T> classType = (Class<T>) type;
    // 实例化泛型T
    T t = classType.newInstance();
}

二、 实体类中的字段及方法

1. 获取实体类中所有字段

在这里插入图片描述

2. 获取字段类型

在这里插入图片描述
或用 getType()
输出:
在这里插入图片描述

3. 获取字段名

在这里插入图片描述
输出:
在这里插入图片描述

4. 获取方法

(1) getDeclaredMethods

getDeclaredMethods可以返回实体类中包含的所有方法。

(2) getDeclaredMethod(String name, Class<?>… parameterTypes)

根据方法名、方法参数类型获取方法。
参照getter/setter方法的命名规则,可以根据字段名生成相应的getter/setter的名字(这里用setter):

	String fieldName = fieds[0].getName();
	String setMethodName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);

设置方法参数类型:

	Class[] paramTypes = new Class[1];
	paramTypes[0] = fields[0].getType();

获取方法:

	Method setMethod = classType.getDeclaredMethod(setMethodName, paramTypes);

5. 执行方法

(1) 设定参数值(paramTypes[0]来源【二3】)

	Object[] values = new Object[1];
    values[0] = matchType("test", paramTypes[0]);

(2) invoke()执行方法(这里用到的t来源于【二1】)

	setMethod.invoke(t, values);

贴一个Method类源代码中invoke的实现:
在这里插入图片描述

 参考:

  1. 博客园 《Class的 getSuperclass与getGenericSuperclass区别

  2. 简书 《Java高级特性——反射

  3. 博客园 《java中关于和<?>的一些了解

  4. 文档之家《遍历实体类属性并赋值

 拓展:

  1. 与<?>的区别:
    (1)是参数类型,常常用于泛型类或泛型方法的定义;<?>是通配符,一般不能直接用来定义类或泛型方法,因为它不能直接参与操作,常常用于泛型方法的调用代码或泛型方法的型参。
    (2)在List、Set、Map中经常见到,用来限制Class中的参数类型,确保Class中参数的一致性;<?>代表任意java类型,只有在不关心数据的具体类型下才使用通配符表示。

 反射实战例子

后续补充反射实例–基于poi的自编导入工具类(支持复杂导入、多重拼接)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大迪吃小迪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值