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