【工具】将类里的属性解析成属性描述的JSONArray数组

2024-04-08 20:20

本文主要是介绍【工具】将类里的属性解析成属性描述的JSONArray数组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

新建一个类,将类里的属性逐个解析出来,用一个json对象封装每一个属性的描述,展示上下级关系;

maven依赖
        <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>4.1.19</version></dependency>
PropertyTypesUtil
package com.xx.util;import cn.hutool.core.util.ReflectUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Objects;public class PropertyTypesUtil {// 白名单包名final static String PKG_NAME = "com.xx";/*** 解析类的参数列表** @param clazz* @return*/public static JSONArray parsePropertyTypes(Class clazz) {JSONArray allInput = new JSONArray();getPropertyTypes(clazz, allInput, null, null);return allInput;}/*** 递归获取类的属性类型*/public static void getPropertyTypes(Class<?> clazz, JSONArray allInput, String parentFieldName, String parentPath) {// 获取当前类的所有属性Field[] fields = ReflectUtil.getFields(clazz);for (Field field : fields) {// 获取属性名称和类型String propertyName = field.getName();Class<?> propertyType = field.getType();String path = (Objects.isNull(parentPath) ? "" : parentPath + ".") + propertyName;if (!Objects.equals("serialVersionUID", propertyName)) {// 存储属性类型信息JSONObject obj = new JSONObject();obj.put("code", propertyName);obj.put("parentCode", parentFieldName);obj.put("type", propertyType.getName().startsWith(PKG_NAME) ? "object" : propertyType.getSimpleName());obj.put("path", path);allInput.add(obj);}// 如果是集合,还需要把泛型解析出来if (List.class.isAssignableFrom(propertyType)) {Type genericType = field.getGenericType();if (genericType instanceof ParameterizedType) {ParameterizedType pt = (ParameterizedType) genericType;Type[] actualTypeArguments = pt.getActualTypeArguments();if (actualTypeArguments.length > 0) {Type actualTypeArgument = actualTypeArguments[0];try {getPropertyTypes(Class.forName(actualTypeArguments[0].getTypeName()), allInput, propertyName, path + "[]");} catch (Exception e) {//log.error("解析:{}异常", actualTypeArgument.toString());}}}}// 如果属性类型是一个类(而不是基本类型),则递归获取这个类的属性类型if (!propertyType.isPrimitive() && propertyType.getName().startsWith(PKG_NAME)) {getPropertyTypes(propertyType, allInput, propertyName, path);}}// 获取父类的属性类型if (clazz.getSuperclass() != null && !clazz.getSuperclass().equals(Object.class)) {getPropertyTypes(clazz.getSuperclass(), allInput, null, null);}}
}
新增两个类

Pojo

package com.xx.util;import lombok.Getter;
import lombok.Setter;@Getter
@Setter
public class Pojo {private String name;private String address;private SubPojo subPojo;
}

SubPojo

package com.xx.util;import lombok.Getter;
import lombok.Setter;@Getter
@Setter
public class SubPojo {private String email;private String qq;
}
测试示例
    @Testpublic void runTest() {JSONArray objects = PropertyTypesUtil.parsePropertyTypes(Pojo.class);System.out.println(objects);}
测试结果
[{"path": "name","code": "name","type": "String"},{"path": "address","code": "address","type": "String"},{"path": "subPojo","code": "subPojo","type": "object"},{"path": "subPojo.email","code": "email","parentCode": "subPojo","type": "String"},{"path": "subPojo.qq","code": "qq","parentCode": "subPojo","type": "String"}
]

over~~

这篇关于【工具】将类里的属性解析成属性描述的JSONArray数组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/886394

相关文章

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Java Scanner类解析与实战教程

《JavaScanner类解析与实战教程》JavaScanner类(java.util包)是文本输入解析工具,支持基本类型和字符串读取,基于Readable接口与正则分隔符实现,适用于控制台、文件输... 目录一、核心设计与工作原理1.底层依赖2.解析机制A.核心逻辑基于分隔符(delimiter)和模式匹