ClassName.this语法,但不适用于内部类

时间:2015-01-04 08:48:30

标签: java jsp taglib

在阅读javax.servlet.jsp.tagext的description时,我在生成的简单标记处理程序(MySimpleTag.java)一节中遇到了语法ClassName.this.methodName()的一种奇怪用法,特别是MySimpleTag.doTag()方法。

public class MySimpleTag
    extends javax.servlet.jsp.tagext.SimpleTagSupport
[...]
{
    protected JspContext jspContext;
    public void setJspContext( JspContext ctx ) {
        super.setJspContext( ctx );
        // Step T.2 - A JspContext wrapper is created.
        // (Implementation of wrapper not shown).
        this.jspContext = new utils.JspContextWrapper( ctx );
    }
    public JspContext getJspContext() {
        // Step T.2 - Calling getJspContext() must return the 
        // wrapped JspContext.
        return this.jspContext;
    }

    public void doTag() throws JspException {
        java.lang.Object jspValue;
        JspContext jspContext = getJspContext();
        JspContext _jsp_parentContext = 
            SimpleTagSupport.this.getJspContext();
        [...]
    }
    [...]
}

我认为ClassName.this只能在需要访问包含类实例的非静态内部类中使用。

事实上,如果我尝试在一个简单的示例中重现这一点,其中派生类使用BaseClass.this.someMethod()调用基类方法,则会出现编译器错误:

error: not an enclosing class: BaseClass
    return Base.this.someMethod();
               ^

这是否意味着API文档中的MySimpleTag.doTag()代码有语法错误?这条线实际上应该是这个吗?

JspContext _jsp_parentContext = 
            super.getJspContext();

1 个答案:

答案 0 :(得分:0)

正如@EJP指出的那样,它可能是一个文档错误。编译时错误很清楚ClassName.this语法在非静态内部类之外是非法的。