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…

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • HDU-1387-Team Queue

    HDU-1387-Team Queue

  • webstorm 2021激活码(注册激活)

    (webstorm 2021激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

  • python代码情话_python怎么运行代码

    python代码情话_python怎么运行代码做微信聊天机器人,实现步骤:1.获取微信的使用权,即python脚本能控制微信收发信息。2.python脚本收到聊天信息后,要对该信息进行处理,返回机器人的回应信息。我这里有一套Python从入门到精通的全套资料免费送给大家,但是要加我的Python学习Q群:808713721才可以免费领取,因为我在里面会私发给大家。简易版代码fromwxpyimport*#apikey在http://www.t…

  • Java基础编程练习题

    Java基础编程练习题很多人在自学java的时候看一遍视频,感觉就会了,课后并没有大量的练习来巩固当前所学的知识点,今天给大家整理了一些非常具有代表意义的题。Java基础类型题1、反转一个只有3位数的整数。从控制台输入321,输出1232、将一个字符由小写字母转换为大写字母。从控制台输入a,输出A3、从控制台输入一个字符串,由字母组成,转换成大写后输出。如果输入的是小写,就转换成大写。…

    2022年10月12日
  • Android物联网应用程序开发(智慧城市)—— 摄像头监控界面开发「建议收藏」

    Android物联网应用程序开发(智慧城市)—— 摄像头监控界面开发「建议收藏」效果:布局代码:<?xmlversion=”1.0″encoding=”utf-8″?><RelativeLayoutxmlns:android=”http://schemas.android.com/apk/res/android”xmlns:app=”http://schemas.android.com/apk/res-auto”xmlns:tools=”http://schemas.android.com/tools”android

  • 【一步一个脚印】Tomcat+MySQL为自己的APP打造服务器(1)服务器环境搭建[通俗易懂]

    【一步一个脚印】Tomcat+MySQL为自己的APP打造服务器(1)服务器环境搭建[通俗易懂]做Android开发一年多了,虽然不敢说有多精通,但也相对熟悉。做久了就会发现Android在行外人眼中是多么高深(包括IOS也一样),但是我们自己知道其实Android和Web前端其实本质上是没有多大的区别,只不过一个是显示在浏览器中,一个是显示在手机上而已。慢慢地,你会发现移动端(Android、IOS、WinPhone、WebAPP)其实涉及到的业务逻辑是很少很少的——无关孰优孰劣,这是分工的不同,移动端毕竟硬件资源有限,适合于简单的计算和交互处理,业务逻辑什么的放在资源更富裕的服

发表回复

您的电子邮箱地址不会被公开。

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