代码之家  ›  专栏  ›  技术社区  ›  Chris Dale

如何基于数组中的字符串访问方法?

  •  0
  • Chris Dale  · 技术社区  · 15 年前

    你好!

    我甚至不确定这是否可能,但希望它是在Java中。我知道我已经在PHP中使用变量变量和动态访问变量,但是我在Java中在不同的问题上阅读这是不可能的。

    我有一个字符串数组,其中包含JSF GUI中复选框的状态。如果设置了所有复选框,则数组将填充包含不同复选框值的字符串。

    复选框的标签和值是通过如下所示的数组循环生成的:

    private static final String[][] OVERVIEW_FIELDS = {{"ID", "requestid"},
        {"Date added", "dob"}, {"Title", "requestTitle"}, {"Process", "processId"},
    ..., ..., ...};
    

    然后,我迭代数组,并使JSF从中选择项:

    for (int i = 0; i < OVERVIEW_FIELDS.length; i++) {
        SelectItem item = new SelectItem(OVERVIEW_FIELDS[i][0], OVERVIEW_FIELDS[i][1]);
        getFields().add(item);
    }
    

    问题和当前的解决方案(希望有人能帮助我将其重构为更好的:

    for (String item : getVisibleFields()) {
               if (item.equals("dob")) {
                    setDob(true);
                }
                if (item.equals("requestTitle")) {
                    setRequestTitle(true);
                }
                if (item.equals("processId")) {
                    setProcessId(true);
                }
                if (...) {
                }
    }
    

    因此,它持续了11个布尔值。我不喜欢这个解决方案,我在系统中的其他bean中也看到了类似的模式。

    有人知道有没有更好的解决办法?布尔值控制列,我根据复选框数组包含的内容将它们的呈现字段设置为真/假。

    我希望在jsf el中可以访问visiblefields变量和contains方法,从而在数组中存在对象时返回true或false。但这似乎不起作用,而且EL不允许我访问contains方法。

    我目前正在使用:

    rendered="#{overviewFilterBean.dob}"
    

    我试过这个代码:

    rendered="#{overviewFilterBean.visibleFields.contains['dob']}">
    

    现在这让我尝试使用我的最终数组并根据 getFields().contains(OVERVIEW_FIELDS[i][1]) 但是我怎样才能使这成为可能呢?

    部分实数和部分伪码如下(我目前的目标是解决方案):

    for (int i = 0; i < OVERVIEW_FIELDS.length; i++) {
        if (item.equals(OVERVIEW_FIELDS[i][1])) {
               setOVERVIEW_FIELDS[i][1](true);
           }
        }
    

    大问题是:

    有什么方法可以让我使用 OVERVIEW_FIELDS[i][1] 要设置正确的布尔变量,或者我可以将其转换成一个映射,并使用JSFEL检查映射中是否存在键?

    感谢您抽出时间,很抱歉写了这么长的问题来讨论一个小问题:/

    编辑:

    反射方法导致了5个异常,处理它们的代码块很大,而且人们说它是一个昂贵的方法。这让我相信,无论是我的旧解决方案,还是使用地图,都是最好的方法。我要试试地图解决方案=)

    3 回复  |  直到 15 年前
        1
  •  1
  •   nos    15 年前

    您可以将值存储在地图中。 但是,如果要将基于methodname的方法作为字符串调用,请使用反射。见 http://java.sun.com/developer/technicalArticles/ALT/Reflection/

        2
  •  3
  •   Michael Myers KitsuneYMG    15 年前

    reflection 你可以这样做:

    for (String item : getVisibleFields()) {
        getClass().getMethod("get" + capitalize(item)).invoke(this, true);
    }
    

    异常处理和 capitalize 方法留给读者作为练习。( invoke 抛出一个 许多 例外情况除外)。

        3
  •  0
  •   bdonlan    15 年前

    可以使用Java反射API动态地查找字段并设置它,如 this example . 请注意,此方法会影响性能。