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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • OpenSSL密码库算法笔记——第5.1.2章 椭圆曲线算法集

    OpenSSL密码库算法笔记——第5.1.2章 椭圆曲线算法集在定义椭圆曲线点群时出现了描述曲线所用算法的参数constEC_METHOD*meth,这一节就来看看这个参数有什么用处。椭圆曲线算法集的定义如下。typedefstructec_method_stEC_METHOD;structec_method_st{(具体定义略,详情可参见代码文件ec_lcl.h)};//EC_METHOD在结构体ec…

    2022年7月20日
    15
  • 圆周率的前十万亿位_圆周率算到60万亿位

    圆周率的前十万亿位_圆周率算到60万亿位3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644…

    2022年9月13日
    4
  • java向上取整函数_java取整函数,向上取整函数Math.ceil()

    java向上取整函数_java取整函数,向上取整函数Math.ceil()你知道java取整函数要怎样实现吗?下面要给大家分享的是java向上取整函数的相关内容,一起来了解一下具体的方法吧!java向上取整函数Math.ceil():doubledividend=7;//被除数doubledivisor=2;//除数doubleflag=0;intresult1=0;intresult2=0;//函数式flag=Math.ce…

    2022年6月21日
    24
  • Epel镜像_镜像包

    Epel镜像_镜像包简介EPEL(ExtraPackagesforEnterpriseLinux),是由FedoraSpecialInterestGroup维护的EnterpriseLinux(RHEL、CentOS)中经常用到的包。一.安装清华大学开源软件镜像站的epel镜像,即yum源yuminstallepel-release二.安装阿里的epel镜像,即yum源1.备份(如有配置其他epel源)mv/etc/yum.repos.d/epel.rep..

    2025年7月2日
    3
  • ftp文件下载工具,四款超级好用的ftp文件下载工具

    ftp文件下载工具,四款超级好用的ftp文件下载工具ftp文件下载工具是什么工具,可能有人会回答说不知道,因为一般只有从事网站管理的工作者会使用的多一点。但不是每个人生来就会的,所以刚开始肯定都会学习怎么使用。这篇文章就来告诉大家有哪些ftp文件下载工具吧。第一款:IIS7服务器管理工具说实话,这个工具算是比较好的管理工具了。里面的功能除了批量管理,还有很多别的功能,主要也是功能也比较全面,相信大多数使用的网站工作人员都比较熟悉了。它里面还能够定时上传下载、定时备份和主动更新。把你花在更新上的经历都省了。IIS7服务器管理工具除了在ftp上面有这么多的

    2022年5月4日
    204
  • 实现JQuery EasyUI右键菜单变灰不可用效果

    实现JQuery EasyUI右键菜单变灰不可用效果

    2021年8月12日
    49

发表回复

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

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