首页 > 其他分享 >TypeReference 获取泛型属性

TypeReference 获取泛型属性

时间:2022-10-26 19:47:10浏览次数:84  
标签:type TypeReference println 泛型 ParameterizedType Type class 属性

当一个对象含有的属性有泛型时, 反序列化该对象可以尝试使用 TypeReference.

例如:

@Data
public class RedisData<T> {
    private LocalDateTime expireTime;
    private T data;
}

当尝试使用 hutool 工具类反序列化该对象时:

RedisData<Shop> redisData = JSONUtil.toBean(json, new TypeReference<RedisData<Shop>>() {
        }, false);

使用 FastJson:

JSONObject jsonObj = new JSONObject();
ist<String> list = jsonObj.getObject("key", new TypeReference<List<Integer>>(){});

hutool 工具类中的 TypeReference 是参考 FastJson 中的 TypeReference.

FastJson 中的 TypeReference.

protected TypeReference(){
	Type superClass = getClass().getGenericSuperclass();

	Type type = ((ParameterizedType) superClass).getActualTypeArguments()[0];

	Type cachedType = classTypeCache.get(type);
	if (cachedType == null) {
		classTypeCache.putIfAbsent(type, type);
		cachedType = classTypeCache.get(type);
	}

	this.type = cachedType;
}

Type[] getActualTypeArguments

核心接口,返回泛型类型数组, 该接口可获取父类实际泛型类型,返回的Type数组对象表示该类型的实际类型参数。

Type getRawType()

返回原始类型Type

Type getOwnerType()

返回 Type 对象,表示此类型是其成员之一的类型。

示例

public static void main(String[] args) {

	class IntMap extends HashMap<String,Integer> {

	}
	IntMap intMap = new IntMap();
	System.out.println("superClass:"+intMap.getClass().getSuperclass());

	Type type = intMap.getClass().getGenericSuperclass();
	if(type instanceof ParameterizedType){
		ParameterizedType p = (ParameterizedType) type;
		for (Type t : p.getActualTypeArguments()){
			System.out.println(t);
		}
	}

	System.out.println("=====newclass=====");
	Map<String,Integer> newIntMap = new HashMap<>();
	System.out.println(newIntMap.getClass().getSuperclass());

	Type newClassType = newIntMap.getClass().getGenericSuperclass();
	if(newClassType instanceof ParameterizedType){
		ParameterizedType p = (ParameterizedType) newClassType;
		for (Type t : p.getActualTypeArguments()){
			System.out.println(t);
		}
	}

	System.out.println("=====subclass=====");
	HashMap<String,Integer> subIntMap = new HashMap<String,Integer>(){};
	System.out.println(subIntMap.getClass().getSuperclass());

	Type subClassType = subIntMap.getClass().getGenericSuperclass();
	if(subClassType instanceof ParameterizedType){
		ParameterizedType p = (ParameterizedType) subClassType;
		for (Type t : p.getActualTypeArguments()){
			System.out.println(t);
		}
	}

}

结果

superClass:class java.util.HashMap
class java.lang.String
class java.lang.Integer
=====newclass=====
class java.util.AbstractMap
K
V
=====subclass=====
class java.util.HashMap
class java.lang.String
class java.lang.Integer

参考文章: https://blog.csdn.net/u014764107/article/details/116933951

标签:type,TypeReference,println,泛型,ParameterizedType,Type,class,属性
From: https://www.cnblogs.com/mynode/p/16829772.html

相关文章

  • cmake 设置属性INTERFACE_INCLUDE_DIRECTORIES,则其它库可以直接 target_link_librarie
    rs项目改为cpm下载项目 leveldb和basiccache,basiccache依赖leveldb,下载都是在主项目中,设置 INTERFACE_INCLUDE_DIRECTORIES后,在basiccache中都不需要find_packa......
  • 数据库添加自增属性列
    搭建测试平台,需要收集测试数据,当时建表时没有考虑加入id列作为自增列,现在需要增加,这里做个笔记1.增加id属性列语法:ALTER table<table_name>add<列名>int;--增加......
  • 通过实现集合来理解泛型
    1.普通集合实现一个string类型的集合,可以添加string类型元素和根据索引读取基本功能。1internalclassProgram2{3staticvoidMain(string[]a......
  • Java中的泛型【多测师_王sir】【软件测试】
    泛型是编译期特性,你只要记住加上就是约束了、限制了,编译期只能加某个类型的对象,计算编译期限制了,实际上在运行期还能把泛型擦除的,可以把泛型理解为一种约束即可。但是运行期......
  • 案例_轮播图、BOM_Window属性
    案例_轮播图<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>轮播图</title></head><body><!--图片--><imgid="img"src="im......
  • ODOO配置属性
    2字段的属性2.1隐藏字段<fieldname='model_name'invisible="True"/>2.2条件下隐藏<fieldname='model_name'attrs="{'invisible':[('mdoel_name'),'=','1']}"......
  • JAVA---HashMap的四种遍历方式,未加泛型
    publicclassHashMapDemo{publicstaticvoidmain(String[]args){HashMaphashMap=newHashMap();hashMap.put("小吉祥草王","纳西妲");......
  • 泛型
    泛型泛型介绍(1)泛型又称参数化类型(接收数据类型的数据类型),是Jdk5.0出现的新特性,解决数据类型的安全性问题(2)在类声明或实例化时只要指定好需要的具体的类型即可(3......
  • vue特殊属性指令,vue条件渲染,vue列表渲染,vue双向数据绑定,vue事件处理
    特殊的属性指令style和class条件渲染列表渲染v-for循环数组,字符串,数字,对象数组的检测与更新双向数据绑定事件处理过滤案例事件修饰符按键修......
  • 数据库字段名称和实体类属性的名称对应不上:
    数据库字段名称和实体类属性的名称对应不上,就不能自动封装数据推荐方法3案例:数据库中字段名称分别为id,brand_name,company_name,ordered,description实体类的属......