文档章节

递归反射笔记

爱coding
 爱coding
发布于 2019/12/26 14:19
字数 304
阅读 13
收藏 0
package com.elong.titan.hotel.util;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * Created by aicoding on 2019/12/23.
 */
public class FiledTool {

    public static void doGetModelFields(Class<?> clazz,Map<String,List<String>> map){
        try {
            String clazzName = clazz.getCanonicalName();
            // 为了防止循环引用,先加入到map中
            List<String> list = new ArrayList<>();
            map.put(clazzName,list);
            // 这个方法只能获取到自己类中的Field,不包含父类的
            // 要注意有个this
            Field[] fields = clazz.getDeclaredFields();
            for (Field field : fields) {
                field.setAccessible(true);
                String fieldName = field.getName();
                if(fieldName.contains("this")){
                    continue;
                }
                Class<?> fieldType = field.getType();
                String simpleName = fieldType.getSimpleName();
                if(("TStruct").equals(simpleName) || ("TField").equals(simpleName) || "schemes".equals(simpleName)){
                    continue;
                }
                if("_Fields".equals(fieldName) || "optionals".equals(fieldName) || "metaDataMap".equals(fieldName)|| fieldName.startsWith("__")){
                    continue;
                }
                String fullName  = fieldType.getCanonicalName();
                if(!simpleClass(fieldType)){
                    // 判断这个是不是基础属性,如果是的话,则可以结束了
                    // 这里获取到的name是 com.platform.xxx.xxx.Model 这样的全路径
                    //如果是复杂属性的话,则先看map中有没有这个属性
                    if(!map.containsKey(fullName)){
                        // 递归去获取属性值
                        doGetModelFields(fieldType,map);
                    }
                }else{
                    Method method = clazz.getDeclaredMethod("getSearchFromEnd");
                    Object res = method.invoke(clazz.newInstance());
                    list.add(simpleName+"-"+fieldName+"-"+res);
                }
//            Method method = clazz.getDeclaredMethod("set"+StringUtils.initCap(s[0]),field.getType());
//            method.invoke(clazz,converAttributeValue(field.getType().getName(),s[1]));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 判断这个类是否是基础类型
     * @param parameterType
     * @return
     */
    public static boolean simpleClass(Class<?> parameterType) {
        return parameterType == String.class ||
                parameterType == Integer.class || parameterType == int.class||
                parameterType == Double.class || parameterType == double.class ||
                parameterType == Long.class || parameterType == long.class ||
                parameterType == Float.class || parameterType == float.class ||
                parameterType == Byte.class || parameterType == byte.class;
    }

}

© 著作权归作者所有

爱coding
粉丝 25
博文 53
码字总数 30196
作品 0
昌平
程序员
私信 提问
加载中

评论(0)

「编程风格: 好代码的逻辑」 读书笔记

date: 2017-12-26 22:52:46 title: 「编程风格: 好代码的逻辑」 读书笔记 编程风格 - 图灵社区: http://www.ituring.com.cn/book/1724 编程风格 - 百度脑图: http://naotu.baidu.com/file/3...

daydaygo
2017/12/27
0
0
读书笔记| 编程风格: 好代码的逻辑

date: 2017-12-26 22:52:46 title: 「编程风格: 好代码的逻辑」 读书笔记 编程风格 - 图灵社区: http://www.ituring.com.cn/book/1724 编程风格 - 百度脑图: http://naotu.baidu.com/file/3...

daydaygo
2018/11/08
0
0
将一个对象的空值全部设置为null

上一篇博客 将一个对象里所有的空值属性设置成null 有个漏洞, 初次接触反射的同学还是建议看我上一篇的博客,看懂了再来看这篇 最近比较有空,重新研究了一下反射,发现反射在获取属性的时候...

太黑_thj
2016/09/13
158
0
老男孩学习---python课程Day06

Day_6笔记(老男孩) 标签(空格分隔): 未分类 一、算法介绍 7FFF00">冒泡算法 7FFF00">选择排序 7FFF00">插入排序 二、递归 三、反射 7FFF00">getattr()、hasattr()、delattr()、setattr()......

Oo熊小猫oO
2016/06/18
20
0
Golang 学习笔记(12)—— ORM实现

本文为转载,原文:Golang 学习笔记(12)—— ORM实现 Golang 介绍 本文将利用之前所学习到的内容实现一个简单的orm,实现比较简单,没有考虑过多的设计原则,以及性能安全之类的,只是单纯...

ChainZhang
2018/01/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

VGG、ResNet、GoogleNet网络理论

本文作者:馬立 分享嘉宾:白浩杰 文章整理:马立辉 内容来源:百度云智学院 导读: 计算机视觉领域涉及许多不同任务,对于图像分类任务,人类一直在追求更高的分类精度,期间衍生了许多有代...

百度开发者中心
03/09
17
0
OSChina 周三乱弹 —— 小姐姐的领带有点带歪了,请帮忙正一下

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《アイタクテ -voice & piano-》- 和紗 手机党少年们想听歌,请使劲儿戳(这里) ...

小小编辑
今天
21
0
对象名称前的单下划线和双下划线是什么意思?

问题: Can someone please explain the exact meaning of having leading underscores before an object's name in Python? 有人可以解释一下在Python中对象名称前加下划线的确切含义吗? ......

技术盛宴
今天
29
0
Redis命令行参数大全

[TOC] Redis命令行参数大全 CLI工具的类型 可执行文件 作用 redis-server Redis Srver相关 redis-cli Redis命令行工具 redis-benchmark 基准测试工具 redis-check-aof AOF持久化文件检测工具...

我爱吃炒鸡
今天
20
0
RHEL8和CentOS8怎么重启网络

RHEL8和CentOS8怎么重启网络 本文主要讲解如何重启RHEL 8或者CentOS 8网络以及如何解决RHEL8和CentOS8系统的网络管理服务报错,当我们安装好RHEL 8或者 CentOS 8,重启启动网络时,会出现以下...

独钓渔
今天
42
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部