繁体   English   中英

如何让子类使用父类的受保护方法?

[英]How do I get a subclass to use a parent class' protected methods?

我正在为 webapps 编写一个前端 controller servlet class。 正面 controller 旨在区分三种基本情况:

  1. 文件请求(调用FileRequestHandler实例)
  2. 数据请求(调用DataRequestHandler实例)
  3. Servlet 请求(调用ServletRequestHandler实例)

为了测试,我想使用 Tomcat 的DefaultServletjavadoc源代码)来提供文件,但我无法让它工作。 问题是即使我的FileRequestHandler class 应该正确扩展DefaultServlet我无法访问其受保护的方法(特别是doGet用于处理 GET 请求)。 顺便说一句,这些类在不同的包中。


代码:

public class FileRequestHandler extends DefaultServlet {

// fields

    private static final long serialVersionUID = 1L;

// methods

    public void setResponse(HttpServletRequest request , HttpServletResponse response, URI uri) 
            throws IOException, ServletException 
    {
                                                                                                                                    /* DEBUG */try {
            System.out.println("(!!) doGet >> " + DefaultServlet.class.getMethod("doGet",new Class[]{HttpServletRequest.class,HttpServletResponse.class}) ) ;
            doGet(request,response) ;
                                                                                                                                    /* DEBUG */}
                                                                                                                                    /* DEBUG */catch(Exception e) { System.out.println("(!) " + this.getClass( ).getName( ) + " >> buildResponse >> " + e.toString( ) ) ; }
    }

 }

堆栈跟踪:

(导致 NullPointer 的部分)

at org.apache.catalina.servlets.DefaultServlet.serveResource(DefaultServlet.java:741) at org.apache.catalina.servlets.DefaultServlet.doGet(DefaultServlet.java:398) at org.pulse.web.FileRequestHandler.buildResponse(FileRequestHandler .java:39)


更新:

我可能需要澄清一下,前面的 controller servlet 将拦截所有 HttpRequests,(web.xml 中的<url-pattern>/</url-pattern> )大意是由 servlet 容器实例化的 DefaultServlet 将不会接收任何请求,如据我所知。 我现在在前面的 controller class 中明确调用了DefaultServlet#init

 FileRequestHandler fileRequestHandler = new FileRequestHandler( ) ;
 fileRequestHandler.init( ) ;

现在我最终得到一个 404 Servlet 不可用。

更新 2 问题 - 事实证明 - 实际上是扩展 class 使用不足的后续问题,而不是 inheritance 的直接问题。


我添加到日志中以检测问题根源的帖子将引发 NoSuchMethodException . 如果我省略它,我会得到一个NullPointerException

它看起来如此简单。 我仍然无法让它按照我想要的方式工作。 有什么想法、建议或见解吗?

TIA,

FK

Class.getMethod返回公共方法 - 没有这样的公共方法,因此例外。 您可以使用getDeclaredMethod获取非公共方法。

目前尚不清楚为什么在没有日志记录的情况下尝试它时会收到NullPointerException - 如果您可以发布更完整的堆栈跟踪,它可能会更清楚。

编辑:从DefaultServlet 的源代码来看,这是引发异常的行:

CacheEntry cacheEntry = resources.lookupCache(path);

但这并没有多大意义,因为init()在这种情况下应该抛出异常......在您的日志中还有其他报告错误吗?

为了从超类调用受保护的方法,您不必做任何特别的事情。 事实上,由于您没有在您的 servlet 中重写doGet() ,因此它的doGet()方法实际上应该是超类方法。 除了正常调用它之外,您不必做任何特别的事情,例如:

public void setResponse(HttpServletRequest request , HttpServletResponse response, URI uri) 
        throws IOException, ServletException  {

        doGet(request,response) ;
}

如果您愿意,可以将doGet(request,response)替换为super.doGet(request,response) ,但在这种情况下没有任何区别,因为您没有在子类中覆盖doGet()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM