0

出于好奇,我查看了 HttpServlet 类的代码,发现它的父类“GenericServlet”定义了在接口“ServletConfig”中声明的方法“getServletName()”。但是,如果 ServletConfig 的对象“sc”不为空,则 GenericServlet 的 getServletName() 方法会调用“sc.getServletName()”。我无法理解这个东西是如何工作的,因为当我在 eclipse 中按 ctrl+click 来查看方法的实现时,它似乎在调用自己!HttpServlet 类中也没有被覆盖的实现!

这是 GenericServlet 实现的快照:

public String getServletName() {
    ServletConfig sc = getServletConfig();
    if (sc == null) {
        throw new IllegalStateException(
            lStrings.getString("err.servlet_config_not_initialized"));
    }

    return sc.getServletName();
}

任何人都可以告诉我这个..

4

1 回答 1

5

javax.servlet.GenericServlet实现了ServletConfig接口,但它不包含 . 它的实际实现。ServletConfig它通过config对象使用委托,这是container在调用init方法时提供的。

GenericServletServletConfigobject (它是StandardWrapperFacadetomcat 的 obj )作为init(ServletConfig config)方法的参数,并在调用时存储其对实例变量的config引用container

  • 初始化方法

     public void init(ServletConfig config) throws ServletException {
     this.config = config;//assign config to the instance variable
     this.init();
     }
    
  • getServletName 方法

    public String getServletName() {
       ServletConfig sc = getServletConfig();//returns the ref of instance variable i.e. config
        if (sc == null) {
            throw new IllegalStateException(
               lStrings.getString("err.servlet_config_not_initialized"));
        }
    
        return sc.getServletName();//call method on config object
      }
     }
    


    因此,它不是调用getServletName()当前实例( ),而是在初始化 servlet 时传递的对象this上调用它。configservlet container


您还应该查看servlet Life-Cycle

为tomcat提供了接口org.apache.catalina.core.StandardWrapper的实际实现。ServletConfig

更新:-

如果你想获得底层类的名称,那么你可以使用object.getClass().getName();方法。

于 2014-09-26T06:42:20.343 回答