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


相关推荐

  • C语言内存模型详细介绍_堆栈介绍

    C语言内存模型详细介绍_堆栈介绍(命令行参数区其实就是在通过dos或shell脚本调用时传递的参数,比如:a.exe123123)上图是C语言内存模型,其实虽然说叫C语言内存模型,其实并不是叫C语言内存模型,而是C语言根据CPU处理器搭建出来的一个模型!在开始介绍这些之前,读者需要了解一些体系结构:冯诺依曼体系:把程序本身当作数据来对待,程序指令和该程序处理的数据用同样的方式储存。冯·诺依曼体系结构的要点是:计算机的数制和…

    2022年6月7日
    111
  • poe交换机和接入交换机的区别_光纤交换机和普通交换机的区别

    poe交换机和接入交换机的区别_光纤交换机和普通交换机的区别POE交换机与普通交换机区别的话,POE交换机就是除了能提供普通交换机所具有的传输功能,还能给网线的另一端设备提供供电功能。普通的交换机主要是交换数据的功能,并没有具备供电的功能。接下来我们就一起来详细看看POE交换机和普通交换机的区别具体有哪些?POE交换机和普通交换机具有以下几点区别:1.可靠性不同:POE交换机就是支持对网线供电的交换机,和普通交换机相比就是受电终端(比如AP、数字摄像头等)不用再进行电源布线,对整个网络而言可靠性更高。2.功能不同:POE交换机就是除了能提供普通交换机所

    2022年10月5日
    0
  • Python二级备考笔记4 同心圆

    Python二级备考笔记4 同心圆1Turtle绘图题:同心圆类型:Turtle绘图‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪

    2022年7月6日
    18
  • 再说注解

    再说注解

    2021年12月16日
    49
  • 匿名函数自调用_自己调用自己的函数叫

    匿名函数自调用_自己调用自己的函数叫我们知道一个HTML文件在被加载的时候是从根标签html依次往下的,在遇到link,script等标签引入的外部资源时,下载外部资源,并执行外部资源。在js中,表达式会被立即执行,也就是说,不管是引入的外部js文件还是嵌入在html文件中的js脚本,其中的表达式都会被立即执行。函数名是一个指向函数的指针。在JavaScript中,定义函数有常见的两种形式:函数声明和函数直接量(或者叫函数表达式)

    2022年10月3日
    0
  • OutOfMemoryError系列(1): Java heap space

    OutOfMemoryError系列(1): Java heap space本文通过实例来分析java.lang.OutOfMemoryError:Javaheapspace问题产生的原因,以及相关的解决方案

    2022年7月7日
    21

发表回复

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

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