gpt4 book ai didi

java - 如何让子类使用父类的 protected 方法?

转载 作者:行者123 更新时间:2023-12-02 08:14:06 25 4
gpt4 key购买 nike

我正在为 web 应用程序编写一个前端 Controller servlet 类。前端 Controller 旨在区分三种基本情况:

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

为了测试,我想使用 Tomcat 的 DefaultServlet ( javadocsource code )来提供文件,但我无法让它工作。问题是,即使我的 FileRequestHandler类应该正确扩展 DefaultServlet我无法访问其 protected 方法(特别是 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 将拦截所有 HttpRequest(web.xml 中的 <url-pattern>/</url-pattern>),从而使 servlet 容器实例化的 DefaultServlet 将不会接收任何请求。我现在已明确调用 DefaultServlet#init在前端 Controller 类中:

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

现在我得到了 404 Servlet 不可用。

更新2:事实证明,这个问题实际上是扩展类使用不当的后续问题,而不是继承的直接问题。

<小时/>

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

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

TIA,

FK

最佳答案

Class.getMethod 返回 public 方法 - 没有这样的 public 方法,因此出现异常。您可以使用getDeclaredMethod来获取非公共(public)方法。

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

编辑:根据 source code for DefaultServlet 判断看起来这是抛出异常的行:

CacheEntry cacheEntry = resources.lookupCache(path);

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

关于java - 如何让子类使用父类的 protected 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6761877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com