Java8替代传统反射动态获取成员变量值的一个示例[通俗易懂]

Java8替代传统反射动态获取成员变量值的一个示例

大家好,又见面了,我是全栈君。

Java8替代传统反射动态获取成员变量值的一个示例

业务背景

新人注册发优惠券 要发送的券的信息以json的格式配置 如下所示

{
      "count":2 #发放2张
      "days":"3,7" #有效期天数 一个有效期天数是3天 一个是7天
      "price":"50" #优惠券面额 2个券的面额都是50元
}

有一个CouponConfig对象对应的是上述Json配置

public class CouponConfig {
    /**
     * 发放张数
     */
    private int count;
    /**
     *  有效期
     */
    private String days;
    /**
     *  优惠券面额
     */
    private String price;

现在想得到一个CouponInfo列表 如发送2张 即要得到一个size=2的couponInfo列表 每个CouponInfo即对应一种发送券信息 于是需要解析原始的days,price

静态的方法 即每个成员变量都有一份

    public int getDays(int i){
        if(this.days.indexOf(",")==-1){ //取值相同
            return Integer.parseInt(days);
        }else{
            return Integer.parseInt(days.split(",")[i]);
        }
    }
    public int getPrice(int i){
        if(this.price.indexOf(",")==-1){ // 取值相同
            return Integer.parseInt(price);
        }else{
            return Integer.parseInt(price.split(",")[i]);
        }
    }

调用示例

        for (int i = 0; i < config.getCount(); i++) {
            System.out.println(config.getDays(i));
            System.out.println(config.getPrice(i));
        }

缺点

  • 代码冗余 需写多份

反射

可以通过传统反射来动态获取成员变量做到只写一份 如下所示

    public int getEachValue(int i, String fieldName){
        try {
            String str = (String) ReflectionUtils.invokeMethod(this.getClass().getMethod("get"+ capitalise(fieldName)), this);
            if(str.indexOf(",")==-1){
                return Integer.parseInt(str);
            }else{
                return Integer.parseInt(str.split(",")[i]);
            }
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        return -1;
    }

此时调用示例

        for (int i = 0; i < config.getCount(); i++) {
            System.out.println(config.getEachValue(i, "days"));
            System.out.println(config.getEachValue(i, "price"));
        }

缺点

  • 对重构不友好 如修改了days–>expireDays 并不会有编译提示

Java8

使用Java8来代替传统反射

    public int getEachValue(int i, Supplier<String> supplier){
        if(supplier.get().indexOf(",")==-1){
            return Integer.parseInt(supplier.get());
        }else{
            return Integer.parseInt(supplier.get().split(",")[i]);
        }
    }

调用示例

        for (int i = 0; i < config.getCount(); i++) {
            System.out.println(config.getEachValue(i,config::getDays));
            System.out.println(config.getEachValue(i,config::getPrice));
        }

此时若修改了变量名称 编译失败

参考文档

https://segmentfault.com/q/10…

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108781.html原文链接:https://javaforall.net

(0)
上一篇 2022年2月22日 下午4:00
下一篇 2022年2月22日 下午5:00


相关推荐

  • IPV6地址格式解析

    IPV6地址格式解析一 IPV6 地址格式 1 1 概述格式 XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX 冒号分 16 进制 每 4 个 16 进制数为一组 每一组可以表示 16 个二进数所以一共有 128 个二进制数 16 进制数 0 9 A F 字母大小不敏感 最终设备显示为大写每段中前面为 0 是允许的 IPV4 中不可以 00XX 00ab XXXX XXXX XXXX XXXX XXXX XXXX1 2 地址的缩写方法 如果一个段全为 0 可以缩写为一个 000AF 0000 0000 0000 X

    2026年3月16日
    3
  • Vue学习之v-model指令

    Vue学习之v-model指令Vue学习之v-model指令

    2022年4月23日
    59
  • 如何使用youmind里面的hsortcuts功能生成知识卡片

    如何使用youmind里面的hsortcuts功能生成知识卡片

    2026年3月13日
    2
  • Linux下Tomcat的安装配置

    Linux下Tomcat的安装配置Linux下Tomcat的安装配置一.下载安装对应的jdk,并配置Java环境。官网下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u26-download-400750.html

    2022年6月2日
    56
  • JavaWeb开发与代码的编写(一)[通俗易懂]

    JavaWeb开发与代码的编写(一)[通俗易懂]JavaWeb开发与代码的编写(一)绝对路径与相对路径在JavaWeb开发中,常使用绝对路径的方式来引入JavaScript和CSS文件,这样可以避免因为目录变动导致引入文件找不到的情况,常用的做法如下:一、使用${pageContext.request.contextPath}  代码”${pageContext.request.contextPath}”的作用是取出部署的应用…

    2022年7月8日
    23
  • android 进度条 代码,Android 进度条使用详解及示例代码

    android 进度条 代码,Android 进度条使用详解及示例代码在这里 总结一下 loading 进度条的使用简单总结一下 一 说起进度条 必须说说条形进度条 经常都会使用到嘛 特别是下载文件进度等等 还有像腾讯安装进度条一样 有个进度总给人良好的用户体验 先来找图看看 做这个图完成不用图片就可以做到了 看下 xml 布局文件 其实就是直接用 xml 写的在加两个属性设置一下就好了 一个 style 另一个是 background android id id pb

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号