记录一次工作中中使用反射

在很多的框架底层,都用到了java反射的原理,当初在学习java基础的时候,在反射这块,也只是稍稍的过了一下,因为一般只有需要写框架,或者去看框架的底层源码的时候,才会用到反射的知识点。
这次,工作中遇到一个问题,那就是需要使用java,充当一个中间商的角色,A服务调用我的java服务给我推送数据,我再通过公安提供的接口地址将数据推送给公安的服务,使用json格式来做中间数据的传输。但是,公安的接口文档中,所有的请求参数都是大写字母加下划线的格式,例如:

{ 
  "MJJCJLXXBZ":"门禁进出XXX",
  "GLDMJ_CJSBXXBZ":"关联的门禁采集XXX"
  ....
}

所有的接口的参数都是这种格式,大概有10几个接口,这些数据都是A服务推送给我的,所以就涉及到我这里需要写对应的Bean来接收这些参数,并将这些Bean转换成公安需要的json格式推送给公安。其实我完全可以用公安的这种数据格式,来声明一个个类,这样我就不用转换。

class Bean {
  private String MJJCJLXXBZ;
  private String GLDMJ_CJSBXXBZ;
  ....
}

这样做不是不可以,但是违反了java的小驼峰的命名方式,对于我这样有轻微洁癖的人是接受不了的,所以我将其换成常规的java小驼峰的命名格式。

class Bean {
  private String mjjcjlxxbz;
  private String gldmjCjsbxxbz;
  ....
}

这样A服务给我推送数据的时候,就采用这种小驼峰的格式,而我接收数据就使用这个bean来接收。但是我还需要将数据转换成公安接口需要的那种格式才能推送成功,传统办法是将bean里一个个字段都进行手动的转换,但是这样的方式并不可取,所以需要写一个通用的方法,进行操作,
此操作要具有通用性,所以我尝试使用泛型+反射来实现上述需求。
实现代码如下:


import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 *
 *
 *@classname RequestData
 *@author 刘岩松
 *@date 2020/6/23 16:31
 */
public class RequestData {

    private static Pattern AZ_PATTERN = Pattern.compile("[A-Z]");
    private static Pattern UNDERLINE_PATTERN = Pattern.compile("_([a-z])");

    public static <T> Map<String, String> generation(T data) {
        Map<String, String> result = new LinkedHashMap<>();
        Class<?> clazz = data.getClass();
        try {
            for (Field field : clazz.getDeclaredFields()) {
                String key = underline(field.getName()).toUpperCase();
                //利用反射执行目标方法获取值
                Method method = clazz.getMethod("get" + field.getName().substring(0, 1).toUpperCase().concat(field.getName().substring(1)));
                String value = (String) method.invoke(data);
                result.put(key, value);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 将驼峰格式字符串转下划线格式
     *
     * @param str 待处理字符串
     * @author 刘岩松
     * @date 2020/6/23 16:55
     */
    private static String underline(String str) {
        //正则匹配大写字符转成小写并在前面加上下划线
        Matcher matcher = AZ_PATTERN.matcher(str);
        StringBuffer sb = new StringBuffer(str);
        if (matcher.find()) {
            sb = new StringBuffer();
            //将当前匹配的子串替换成指定字符串,
           //并且将替换后的子串及之前到上次匹配的子串之后的字符串添加到StringBuffer对象中
            //正则之前的字符和被替换的字符
            matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
            //把之后的字符串也添加到StringBuffer对象中
            matcher.appendTail(sb);
        } else {
            return sb.toString();
        }
        return underline(sb.toString());
    }

    /**
     *
     *将下划线格式字符串转驼峰格式
     *
     * @param str string 待处理字符串
     * @author 刘岩松
     * @date 2020/6/23 16:00
     */
    private static String camel(String str) {
        //正则匹配下划线及后一个字符,删除下划线并将匹配的字符转成大写
        Matcher matcher = UNDERLINE_PATTERN.matcher(str);
        StringBuffer sb = new StringBuffer(str);
        if (matcher.find()) {
            sb = new StringBuffer();
            //将当前匹配的子串替换成指定字符串,
            //并且将替换后的子串及之前到上次匹配的子串之后的字符串添加到StringBuffer对象中
            //正则之前的字符和被替换的字符
            matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
            //把之后的字符串也添加到StringBuffer对象中
            matcher.appendTail(sb);
        } else {
            return sb.toString();
        }
        return camel(sb.toString());
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341