获取java对象变量名的值

获取java对象变量名的值,java,Java,从周一到周日,我在java对象中有7个布尔变量。我试图从一个天数列表的for循环中找到一种简洁的方式来表示以下内容: private boolean isWorkDay(String day, Object pgMasterTaskList) { if(day=="Sunday" && pgMasterTaskList.Sunday==true) { return true; } if(day=="M

从周一到周日,我在java对象中有7个布尔变量。我试图从一个天数列表的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,所以我处理字符串比较,因为我必须将它们映射到pdf中的字段名。所以我试着保持一致。任何一天的组合都可能是一个工作日。我想这就剩下128个组合了?2^7. 该信息由csv输入,因此我希望以字符串形式读取day in,因为它是以字符串形式输入的。

您必须使用反射:

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

注意:调用者必须处理以下情况:他们度过的一天为空或错误,或者布尔成员不是公共成员。

必须使用反射:

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

注意:调用者必须处理以下情况:他们度过的一天是空的或是错误的,或者布尔成员不是公共的。

如果您可以修改任务列表对象以保存一组工作日而不是7个布尔值,那么您甚至不需要循环。在线性时间内进行表格查找即可

    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);
[星期一、星期二、星期四]

编辑2:

下面是一个将一行布尔值从CSV文件转换为枚举集的简单示例

[星期一、星期二、星期四]

链接 解释如何使用java.time。
如果您可以修改任务列表对象以保存一组工作日而不是7个布尔值,那么您甚至不需要循环。在线性时间内进行表格查找即可

    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);
[星期一、星期二、星期四]

编辑2:

下面是一个将一行布尔值从CSV文件转换为枚举集的简单示例

[星期一、星期二、星期四]

链接 解释如何使用java.time。
我使用以下方法找到了问题的答案:

  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;
    }
我在这个链接上找到了它:


谢谢大家花时间回复,而且回复得如此之快

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

  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;
    }
我在这个链接上找到了它:


谢谢大家花时间回复,而且回复得如此之快

可以使用Object class.getClass.getFields方法获取类中的所有变量,也可以使用specific.getClass.getFieldvariableName获取特定变量

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;
  }
线条对象obj=null;在上面的示例中,它只是一个占位符,用于使用.get获取变量

但是,只有当day参数的值与pgMasterTaskList类中定义的变量名完全匹配时,这才有效。如果需要基于不区分大小写的场景进行提取,可以使用.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;
  }

.getobj将返回一个属于您的变量的类类型的对象您的变量是布尔型的,然后返回的obj将是布尔型的

可以使用Object class.getClass.getFields方法获取类中的所有变量,也可以使用specific.getClass.getFieldvariableName获取特定变量

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;
  }
线条对象obj=null;在上面的示例中,它只是一个占位符,用于使用.get获取变量

但是,只有当day参数的值与pgMasterTaskList类中定义的变量名完全匹配时,这才有效。如果需要基于不区分大小写的场景进行提取,可以使用.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;
  }
.getobj将返回一个属于您的变量的类类型的对象您的变量是布尔型的,然后返回的obj将是布尔型的

尝试创建一个枚举,然后方法逻辑将如下所示:

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;
}

尝试创建一个枚举,然后方法逻辑将如下所示:

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;
}


注意:在Java中使用==比较字符串并不像您认为的那样。使用equals代替。看看:你也可以考虑使用这个日期。例如,在7个布尔值中使用java。使用equals代替。看,你也可以考虑重新使用,比如说“平等”,它将解决你的问题。而不是7个布尔值,使用一个枚举。每天都是工作日吗?没有我的进一步解释,这个答案是伟大的。不幸的是,设定的工作日是以csv的形式出现的,并且可能每周都在变化。我在别处找到了一个对我有用的答案,但我真的很感激
吃你的输入!谢谢你的回复。这可能是口味的问题,而不是其他问题。我想我还是要坚持EnumSet方法。参见我的编辑。@MatthewC我添加了一个简单的示例,将CSV文件中的布尔值转换为枚举集-通过循环,您也可以使用流操作,留给读者。无需我进一步解释,这个答案非常好。不幸的是,设定的工作日是以csv的形式出现的,并且可能每周都在变化。我在其他地方找到了一个对我有用的答案,但我真的很感谢你的意见!谢谢你的回复。这可能是口味的问题,而不是其他问题。我想我还是要坚持EnumSet方法。请参阅我的编辑。@MatthewC我添加了一个简单的示例,将布尔值从CSV文件转换为枚举集-通过循环,您也可以使用流操作,留给读者。感谢您回答自己的问题。我不完全清楚这个代码如何与问题中的代码相匹配,但是…?@OleV.V。呜呜!如果我参考那个原始的方法会有帮助的,不是吗?哈哈。我已经做了上面的编辑。@MatthewC,在上面的方法中,我可以建议在getValueOf方法中不需要多个if-else。您可以直接返回field.getclazz并在任何您想要使用它的地方键入cast返回的对象。由于字段viz中的所有方法,当前代码可能没有用处。getInt、getDouble返回一个需要在getValue调用点强制转换的对象。如果布尔getValueOfpgMasterTaskList是将值强制转换为布尔值的日期,请参阅此行。因此,您可以删除多个if-else,只需使用field.getclazz。感谢您回答自己的问题。我不完全清楚这个代码如何与问题中的代码相匹配,但是…?@OleV.V。呜呜!如果我参考那个原始的方法会有帮助的,不是吗?哈哈。我已经做了上面的编辑。@MatthewC,在上面的方法中,我可以建议在getValueOf方法中不需要多个if-else。您可以直接返回field.getclazz并在任何您想要使用它的地方键入cast返回的对象。由于字段viz中的所有方法,当前代码可能没有用处。getInt、getDouble返回一个需要在getValue调用点强制转换的对象。如果布尔getValueOfpgMasterTaskList是将值强制转换为布尔值的日期,请参阅此行。因此,您可以删除multipleif-else,只需使用field.getclazz