배열의 문자열을 기반으로 메소드에 액세스하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/1051075

  •  20-08-2019
  •  | 
  •  

문제

안녕하세요!

이것이 가능한지조차 확신하지 못하지만 바라건대 Java에 있습니다. 변수 변수를 사용하고 변수에 동적으로 액세스하여 PHP에서 수행 한 것을 알고 있지만 다른 질문에서 Java에서는 이것이 불가능하다는 것을 읽었습니다.

JSF GUI에 체크 박스 상태가 포함 된 문자열 배열이 있습니다. 모든 확인란이 설정되면 배열은 다른 확인란의 값을 포함하는 문자열로 채워집니다.

확인란의 레이블과 값은 다음과 같은 모습을 통해 반복하여 구축됩니다.

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

그런 다음 배열을 반복하고 JSF SelectItems를 만들어냅니다.

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 부 화병제를 위해 계속됩니다. 이 솔루션이 마음에 들지 않으며 시스템의 다른 콩에서 비슷한 패턴이 보입니다.

이것에 대한 더 나은 해결책이 있는지 아는 사람이 있습니까? 체크 박스 어레이에 포함 된 내용에 따라 렌더링 된 필드를 true/false로 설정하는 부울 제어 열.

JSF EL에서 visiblefields 변수와 포함 메소드에 액세스 할 수 있기를 바랐으므로 객체가 배열에 존재하는 경우 true 또는 false를 반환합니다. 이것은 작동하지 않는 것 같습니다. EL은 내용 방법에 액세스하지 못합니다.

나는 현재 사용하고있다 :

rendered="#{overviewFilterBean.dob}"

그리고 나는이 코드를 시도했다 :

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

이제 이로 인해 최종 배열을 사용하고 부울을 설정했습니다. getFields().contains(OVERVIEW_FIELDS[i][1]),하지만 어떻게 이것을 가능하게 할 수 있습니까?

Part Real 및 Part Pseudo 코드는 다음과 같습니다 (현재 목표로하고있는 솔루션) :

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] 올바른 부울 변수를 설정하거나이를 맵으로 바꾸고 JSF EL을 사용하여 맵에 키가 있는지 확인할 수 있습니까?

시간 내 주셔서 감사합니다. 작은 지점에 도달하기 위해 긴 질문을 써서 죄송합니다 :/

편집하다:

반사 방법으로 5 개의 예외가 발생했으며, 큰 코드 블록을 처리하고 사람들은 또한 비싼 방법이라고 말했습니다. 이것은 나의 오래된 솔루션이나지도를 사용함으로써 그것을 수행하는 가장 좋은 방법이라고 믿게한다. 나는지도 솔루션을 시도 할거야 =)

도움이 되었습니까?

해결책

항상 값을지도에 저장할 수 있습니다. 그러나 메소드 이름을 문자열로 기준으로 메소드를 호출하려면 반사를 사용하십시오. 보다http://java.sun.com/developer/technicalarticles/alt/reflection/

다른 팁

와 함께 반사, 넌 할 수있어:

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

예외 처리 및 capitalize 방법은 독자에게 연습으로 남겨 둡니다 (invoke 던지는 a 많은 예외).

Java Reflection API를 사용하여 필드를 동적으로 찾아서 설정할 수 있습니다. 이 예. 이 방법에는 성능이 히트 할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top