【问题标题】:JSF backing bean can't access the override method of the nested classJSF 支持 bean 无法访问嵌套类的覆盖方法
【发布时间】:2011-03-05 18:28:48
【问题描述】:

我使用的是jsf1.2的XHTML如下:

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

那么backing bean看起来像:

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

如果我重写作为支持 bean 的嵌套类的 DataTableWeb 类的公共方法。我会得到以下异常:

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"

但是,如果访问公共方法没有在支持 bean 中被覆盖,它会正常工作。

谁能帮我弄清楚? 任何帮助表示赞赏。

【问题讨论】:

标签: java jsf


【解决方案1】:

这是反射的一般问题。它的访问控制只允许语言本身允许的子集。基本上,要使反射起作用,您需要将所有内容公开。

在您的情况下,您需要将 dtw 初始化程序设为非匿名 public 类,如下所示:

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

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

如果您需要访问外部this,请不要忘记从类定义中删除static

【讨论】:

  • 嗨,双倍。非常感谢你。但是我仍然对为什么在 Class DataTableWeb 中使用原始方法 updatePage() 可以正常工作感到困惑。
  • @mark-zhu:因为(我猜)它是在公共类中定义的。反射与普通访问的不同之处在于它还考虑了类的访问限制。例如。对于普通访问“私有类但公共方法”是可以的:只要您引用了一个对象,您是否可以访问它的实际类并不重要。但是对于反射,这不起作用,您还需要公开该类。
【解决方案2】:

再次感谢你。我可以这样理解吗

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

}

因为i有对象dtw的引用,所以反射可以访问dtw的public方法。 但是如果我在 ClasssurveySubFmTreeViListWeb 中覆盖了一些公共方法,则由于访问受限,反射将不起作用

【讨论】:

    猜你喜欢
    • 2013-12-04
    • 2010-10-18
    • 1970-01-01
    • 2011-01-10
    • 2021-03-12
    • 2014-07-02
    • 1970-01-01
    • 2019-02-24
    • 2013-10-26
    相关资源
    最近更新 更多