繁体   English   中英

获取 java object 变量名的值

[英]Get value of java object variable name

我在一周中的几天(周一至周日)的 java object 中有 7 个 boolean 变量。 我试图从几天列表的 for 循环中找到一种简洁的方式来说明以下内容:

    private boolean isWorkDay(String day, Object pgMasterTaskList) {
        if(day=="Sunday" && pgMasterTaskList.Sunday==true) {
            return true;
        }
        if(day=="Monday" && pgMasterTaskList.Monday==true) {
            return true;
        }
        if(day=="Tuesday" && pgMasterTaskList.Tuesday==true) {
            return true;
        }
        if(day=="Wednesday" && pgMasterTaskList.Wednesday==true) {
            return true;
        }
        if(day=="Thursday" && pgMasterTaskList.Thursday==true) {
            return true;
        }
        if(day=="Friday" && pgMasterTaskList.Friday==true) {
            return true;
        }
        if(day=="Saturday" && pgMasterTaskList.Saturday==true) {
            return true;
        }
        else return false;
    }

我希望我可以用类似的东西来减少重复。

private boolean isWorkDay(String day, Object pgMasterTaskList) {
        if(pgMasterTaskList.getVariableByName(day)==true) {
            return true;
        }
        else return false;
    }

我的想法是使用反射来检查名为“Monday”的变量的值是否等等,但我不确定如何以这种方式使用它。

编辑

我已经提交了一个适用于我的具体案例的答案。 再详细一点...

我正在将此信息写入 pdf,因此我正在处理字符串比较,因为我必须将它们 map 到 pdf 中的字段名称。 所以我试图保持一致。 任何一天的组合都可以是一个工作日。 我想这给我留下了 128 个连击? (2^7)。 该信息由 csv 输入,因此我想将 day in 作为字符串读取,因为它是这样输入的。

如果您可以修改任务列表 object 以保存一Set工作日而不是 7 个 Boolean 值,那么您甚至不需要循环。 线性时间的表查找就可以了。

    DateTimeFormatter dowFormatter = DateTimeFormatter.ofPattern("cccc", Locale.ENGLISH);

    EnumSet<DayOfWeek> workdays = EnumSet
            .of(DayOfWeek.MONDAY, DayOfWeek.TUESDAY, DayOfWeek.THURSDAY);
    String day = "Tuesday";

    DayOfWeek dow = dowFormatter.parse(day, DayOfWeek::from);
    boolean isWorkDay = workdays.contains(dow);

    System.out.println("Is work day? " + isWorkDay);

示例中的 Output:

是工作日吗? 真的

EnumSet实现为 Boolean 值的数组。

我相信您将EnumSet放入您的 object 并以类似于您在问题中所做的方法包装代码。

我在用于定义星期几的格式化程序的格式模式字符串中使用的模式字母c并不经常使用。 坦率地说,我怀疑在这里使用它是否正确。 根据文档,它为我们提供了本地化星期几文本的独立形式。 由于单独的星期几——它不是日期字符串的一部分——我认为它可能是正确的。 如果没有,请使用更常见的EEEE 至少对于英语来说,两者都有效。

编辑:即使您的 7 boolean 值来自 CSV 文件,我可能仍会使用 set 方法。 对于初始化集合,我不认为我会诉诸反射,而是接受 7 if语句(这里比我们大多数人在实际代码中所做的更简洁):

    boolean sunday = false;
    boolean monday = true;
    boolean tuesday = true;
    boolean wednesday = false;
    boolean thursday = true;
    boolean friday = false;
    boolean saturday = false;

    Set<DayOfWeek> workdays = EnumSet.noneOf(DayOfWeek.class);
    if (sunday) workdays.add(DayOfWeek.SUNDAY);
    if (monday) workdays.add(DayOfWeek.MONDAY);
    if (tuesday) workdays.add(DayOfWeek.TUESDAY);
    if (wednesday) workdays.add(DayOfWeek.WEDNESDAY);
    if (thursday) workdays.add(DayOfWeek.THURSDAY);
    if (friday) workdays.add(DayOfWeek.FRIDAY);
    if (saturday) workdays.add(DayOfWeek.SATURDAY);

    System.out.println(workdays);

[周一、周二、周四]

编辑2:

这是一个将 Boolean 值从 CSV 文件转换为EnumSet<DayOfWeek>的简单示例。

    String lineFromCsv = "false;true;true;false;true;false;false";

    String[] workDayStrings = lineFromCsv.split(";");
    Set<DayOfWeek> workdays = EnumSet.noneOf(DayOfWeek.class);
    // Sunday
    if (Boolean.valueOf(workDayStrings[0])) {
        workdays.add(DayOfWeek.SUNDAY);
    }
    // Monday through Saturday
    for (int i = 1; i < workDayStrings.length; i++) {
        if (Boolean.valueOf(workDayStrings[i])) {
            workdays.add(DayOfWeek.of(i));
        }
    }
    System.out.println(workdays);

[周一、周二、周四]

关联

我使用以下方法找到了我的问题的答案:

  public static Object getValueOf(Object clazz, String lookingForValue)
      throws Exception {
    Field field = clazz.getClass().getField(lookingForValue);
    Class clazzType = field.getType();
    if (clazzType.toString().equals("double"))
      return field.getDouble(clazz);
    else if (clazzType.toString().equals("int"))
      return field.getInt(clazz);
    // else other type ...
    // and finally
    return field.get(clazz);
  }

我现在这样称呼它:

    private boolean isWorkDay(String day, PlanGridMasterTaskList pgMasterTaskList) throws Exception {
        System.out.println(getValueOf(pgMasterTaskList, day));
        if ((boolean) getValueOf(pgMasterTaskList, day)) {
            return true;
        }
        else
            return false;
    }

我在这个链接上找到了它: https://www.rgagnon.com/javadetails/java-0038.html

感谢所有花时间回复的人(而且回复如此之快。)。

您可以使用 Object class .getClass().getFields()方法获取 class 中的所有变量或使用特定的.getClass().getField("variableName")获取变量。

java 反射 api 将允许将变量作为字段(java.lang.reflect) 获取

  private boolean isWorkDay(String day, Object pgMasterTaskList)
      throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException {
    Object obj = null;
    if (pgMasterTaskList.getClass().getField(day).get(obj).equals(true)) {
      return true;
    } else
      return false;
  }

Object obj = null; 上面只是使用.get()获取变量的占位符。

但是,只有当day参数的值与 pgMasterTaskList class 中定义的变量名称完全匹配时,这才有效。 如果您想要基于不区分大小写的场景进行提取,您可以使用.getFields()方法。 下面是一个相同的例子:

  private boolean isWorkDay(String day, Object pgMasterTaskList) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException {
    Object obj = null;
    for (Field field : pgMasterTaskList.getClass().getFields()) {
      if (day.equalsIgnoreCase(field.getName())) {
        obj = field.get(obj);
        if ((boolean) obj == true)
          return true;
      }
    }
    return false;
  }

.get(obj)将返回 object 变量的 class 类型(您的变量是 boolean,然后返回 obj 将是布尔类型)。

您必须为此使用反射:

private boolean isWorkDay(String day, Object pgMasterTaskList) throws NoSuchFieldException, NullPointerException, SecurityException {
    return pgMasterTaskList.getClass().getField(day);
}

注意:调用者必须处理他们通过一天是 null 或只是错误的情况,或者 boolean 成员不公开的情况。

尝试创建一个enum ,然后您的方法逻辑将如下所示,

public class WeekMap {

    public static void main(String[] args) {
        System.out.println(isWorkDay("SUNDAY",WeekDays.SUNDAY));
        System.out.println(isWorkDay("sunday",WeekDays.SUNDAY));
        System.out.println(isWorkDay("sunday",WeekDays.SATURDAY));
        System.out.println(isWorkDay("ABS",WeekDays.SATURDAY));
    }

    private static boolean isWorkDay(String day, WeekDays pgMasterTaskList) {
        WeekDays day1 = WeekDays.valueOf(day.toUpperCase()); // Fetch the mapped day for the string
        try{
            day1 = WeekDays.valueOf(day.toUpperCase());
        } catch (IllegalArgumentException iex) {
            iex.printStackTrace(); // this can be suppress
        }
        return day1 == pgMasterTaskList;
    }
}

enum WeekDays{ // Create enum for week day names
    SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM