2010-06-19 5 views
1

중첩 된 클래스의 재정의 메서드에 액세스 할 수 없습니다 :JSF 뒷면 콩 내가 XHTML을 JSF1.2 사용하고

public class SurveySubFmTreeViListWeb 
    { 
    ..... 
     private DataTableWeb<Entity> dtw = new DataTableWeb<Entity>(Entity.class) { 
       @Override 
       public void updatePage() throws Exception 
       {...snip...} 
     }; 
    } 

:

<h:commandLink label="Open" action="#{surveySubFmTreeViListWeb.dtw.updatePage}"> 

다음 백업 빈처럼 보인다 만약 내가 DataTableWeb 클래스의 public 메소드를 오버라이드한다면, 이것은 백킹 빈의 중첩 클래스이다. 다음과 같은 예외가 발생합니다 :

java.lang.IllegalAccessException: Class org.apache.el.parser.AstValue can not access a member of class com.ss.survey.web.SurveySubFmTreeViListWeb $1 with modifiers "public" 

그러나 공개 메서드가 뒷받침 빈에서 재정의되지 않은 경우에는 정상적으로 작동합니다.

누구든지 알아낼 수 있습니까? 도움을 주시면 감사하겠습니다.

+0

관련 항목 : http://stackoverflow.com/questions/2998745/how-to-invoke-jsf-action- 익명 - 클래스 - 엘 - can not-access-it – BalusC

답변

1

리플렉션의 일반적인 문제입니다. 액세스 제어는 언어 자체가 허용하는 서브 세트 만 허용합니다. 기본적으로 리플렉션이 작동하려면 모든 것을 공개해야합니다. 귀하의 경우에는

당신은 종류의이 같은 dtw 초기화되지 않은 익명 공공 클래스를 만들 필요가 : 당신이 외부 this에 액세스해야하는 경우

private DataTableWeb<Entity> dtw = new CustomDataTableWeb(); 

public static class CustomDataTableWeb extends DataTableWeb <Entity> 
{ 
    @Override 
    public void updatePage() throws Exception 
    {...snip...} 
}; 

가에서 static을 제거하는 것을 잊지 마세요 클래스 정의.

+0

안녕, doublep. 정말 고마워. 그러나 나는 여전히 클래스 DataTableWeb에서 updatePage() 메소드를 사용하여 원래의 메소드를 사용하는 것이 왜 괜찮은지 혼란스러워했습니다. – user371004

+0

@ mark-zhu : (아마도) 공개 클래스에 정의되어 있기 때문입니다. 리플렉션은 클래스의 액세스 제한도 고려한다는 점에서 일반 액세스와 다릅니다. 예 : 일반 액세스의 경우 "개인 클래스이지만 공용 메서드"는 정상입니다. 객체에 대한 참조가있는 한 실제 클래스에 액세스 할 수 있는지 여부는 중요하지 않습니다. 그러나 이것이 반영되지 않기 때문에 클래스가 공개되어야합니다. – doublep

0

다시 한 번 감사드립니다. 반사가 DTW의 공개 방법에 접근 할 수 있도록 제가

다음
what's happening behind the scenes: 
action="#{surveySubFmTreeViListWeb.dtw.updatePage}" 

public static void main(String[] args) throws Exception { 
Object dtw = SurveySubFmTreeViListWeb.getClass().getDeclaredMethod("getDtw", null).invoke(surveySubFmTreeViListWeb, null); 
Object action = dtw .getClass().getDeclaredMethod("updatePage",null).invoke(dtw , 0); 

}

제가 DTW 객체에 대한 참조를 갖기 때문에으로 취할 수있다. 하지만 surveySubFmTreeViListWeb 클래스의 public 메서드를 오버라이드 한 경우 리플렉션이 제한된 액세스로 인해 작동하지 않습니다

+0

답을 추가하지 말고 원래 질문을 편집하십시오. –

+0

감사합니다. doublep. 나는 그 문제를 해결한다. 좋은 사람. – user371004