0

好奇心から HttpServlet クラスのコードを調べたところ、その親クラス「GenericServlet」がインターフェース「ServletConfig」で宣言されたメソッド「getServletName()」を定義していることがわかりました。ただし、ServletConfig のオブジェクト「sc」が null でない場合、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を使用して委任を使用します。configcontainerinit

GenericServletServletConfigobject ( StandardWrapperFacadetomcat の obj ) を method のパラメーターとして取り、によって呼び出されたときinit(ServletConfig config)にインスタンス変数への参照を格納します。configcontainer

  • 初期化方法

     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()on current instance( this) を呼び出すのではなく、サーブレットの初期化中にconfig渡されるオブジェクトで呼び出します。servlet container


サーブレットの Life-Cycle も見てください。

tomcatは、インターフェイスorg.apache.catalina.core.StandardWrapperの実際の実装を提供しServletConfigます。

アップデート:-

基礎となるクラスの名前を取得したい場合は、object.getClass().getName();メソッドを使用できます。

于 2014-09-26T06:42:20.343 に答える