TomcatはXMLを解析し、リフレクションを通じてオブジェクトを作成します。

TomcatはXMLを解析し、リフレクションを通じてオブジェクトを作成します。

次のサンプル コードでは、Tomcat が XML を解析し、リフレクションを通じてオブジェクトを作成する原理を紹介しています。具体的なコードは次のとおりです。

java.lang.reflect.InvocationTargetException をインポートします。
java.lang.reflect.Method をインポートします。
java.util.List をインポートします。
org.dom4j.Document をインポートします。
org.dom4j.DocumentException をインポートします。
org.dom4j.Element をインポートします。
org.dom4j.io.SAXReader をインポートします。
パブリッククラス ServerReadXML1 {
  パブリック静的void main(String[] args)
      DocumentException、ClassNotFoundException、InstantiationException、IllegalAccessException をスローします。
      NoSuchMethodException、SecurityException、IllegalArgumentException、InvocationTargetException {
    // ブラウザにサーブレットのURLパターンを入力すると
    文字列 urlPattern = "/first";
    // urlPattern に従ってクラス名を取得します。String className = getClassByUrl(urlPattern);
    // 完全なクラス名に基づいて Class オブジェクトを取得します。Class clazz = Class.forName(className);
    // clazz オブジェクトを反映して指定されたオブジェクトを作成します。Object obj = clazz.newInstance();
    // サービス メソッドを取得します。Method method = clazz.getDeclaredMethod("service");
    // 権限を取得する method.setAccessible(true);
    // サービス メソッドを実行します method.invoke(obj);
  }
  プライベート静的文字列 getClassByUrl(文字列 urlPattern) は DocumentException をスローします {
    // 1. SAXReader オブジェクトを作成する SAXReader reader = new SAXReader();
    // 2. ファイルを読み取る Document document = reader.read(ServerReadXML1.class.getClassLoader().getResourceAsStream("web.xml"));
    // 3. ルートノードを取得します。 Element rootElement = document.getRootElement();
    //System.out.println(rootElement.getName());
    // 4. ルートノードの下の子ノード List<Element> を取得します。servletList = rootElement.elements();
    // urlPattern と同じ servlet-name タグの内容を記録します String servletName = "";
    // servlet タグに servlet-class の内容を記録します // servletClassName の内容は、サーブレットの完全なクラス名です String servletClassName = "";
    // 5. 子ノードを走査します for (Element servletElement : servletList) {
      //System.out.println(servletElement.getName());
      // サーブレット マッピング タグの場合は、コードを実行します。if ("servlet-mapping".equals(servletElement.getName())) {
        // url-pattern タグ オブジェクトを取得します。 Element url = servletElement.element("url-pattern");
        // タグの内容が入力されたurlPattern値と同じかどうかを確認します。if (urlPattern.equals(url.getText())) {
          //urlPatternと同じservlet-nameタグの内容を記録します //同じ場合はServletNameを記録します
          // サーブレット マッピング内の servelt-name の内容を取得します。servletName = servletElement.element("servlet-name").getText();
        }
      }
    }
    // 再度走査 for (Element servletElement : servletList) {
      // サーブレットタグの場合は、このコードを実行します if ("servlet".equals(servletElement.getName())) {
        // 前回のトラバーサルで取得した servletName の値が、今回のトラバーサルの servlet-name の内容と同じかどうかを判定します。if (servletName.equals(servletElement.element("servlet-name").getText())) {
          // 同じレコード servletClassName の場合
          servletClassName = servletElement.element("servlet-class").getText();
        }
      }
    }
    // サーブレットの完全なクラス名を返す servletClassName
    servletClassName を返します。
  }
}

1. 反省を通じてクラスを獲得する4つの方法

@テスト
  パブリックvoid test1()はClassNotFoundExceptionをスローします{
    //1. クラス名.class
    クラス clazz = String.class;
    System.out.println(clazz);
    //2. オブジェクト.getClass()
    クラス clazz1 = "abc".getClass();
    システム出力をprintln(clazz1);
    //3.クラス.forName();
    クラス clazz2 = Class.forName("java.lang.String");
    システム出力をprintln(clazz2);
    //4.ClassLoader .loadClass("完全なクラス名")
    クラス clazz3 = ReflectTest1.class.getClassLoader().loadClass("java.lang.String");
    システム出力のprintln(clazz3);
  }

2. 反射特性の一般的な使用方法

@テスト
  public void test2() は、ClassNotFoundException、NoSuchFieldException、SecurityException、IllegalArgumentException、IllegalAccessException をスローします {
    // クラス オブジェクトを取得してその内部プロパティを取得します。Class clazz = Class.forName("com.atguigu.bean.User");
    ユーザー user = new User();
    //Field オブジェクトはクラス属性を表します。getField はパブリック属性のみを取得できます。Field field = clazz.getField("email");
    System.out.println(フィールド);
     //このメソッドはコードのカプセル化を破壊するため、推奨されません。Field field2 = clazz.getDeclaredField("id");
    System.out.println(フィールド2);
    フィールド2にAccessibleを設定します(true);
    フィールド2.setInt(ユーザー、1001);
    System.out.println(ユーザー);
  }

3. 反射の一般的な使用方法

@テスト
  public void test3() は、ClassNotFoundException、InstantiationException、IllegalAccessException、NoSuchMethodException、SecurityException、IllegalArgumentException、InvocationTargetException をスローします {
    クラス clazz = Class.forName("com.atguigu.bean.User");
    //リフレクションを通じてオブジェクトを作成します。Object obj = clazz.newInstance();
    //ここで名前の値を設定します String fileName = "name";
    //メソッド名を作成する String methodName = "set" + fileName.substring(0, 1).toUpperCase() //N
    + fileName.substring(1).toLowerCase(); //名前
    // メソッド名に従ってパブリック メソッドを取得します。Method method = clazz.getMethod(methodName, String.class);
    //指定されたメソッドを実行します。method.invoke(obj, "yangjian");
    System.out.println(obj);
  }

要約する

上記は、エディターが紹介した Tomcat が XML を解析し、リフレクションを通じてオブジェクトを作成する原理です。皆様のお役に立てれば幸いです。ご質問がある場合は、メッセージを残してください。エディターがすぐに返信いたします。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。
この記事が役に立ったと思われた方は、ぜひ転載していただき、出典を明記してください。ありがとうございます!

以下もご興味があるかもしれません:
  • Tomcat コアコンポーネントとアプリケーションアーキテクチャの詳細な説明
  • SpringBoot組み込みTomcatの起動原理の詳しい説明
  • Tomcatの動作原理を分析する
  • Tomcat の startup.bat 原則の詳細な分析
  • Tomcat における catalina.bat 原理の詳細な分析
  • Tomcat データ ソースの原理、構成、使用方法の紹介
  • Tomcatホットデプロイメントの実装原理の詳細な説明
  • Tomcatアーキテクチャの原則をアーキテクチャ設計に分析する

<<:  JavaScript 組み込みの日付と時刻の書式設定のサンプル コード

>>:  意外と知らないJSのループ速度テストのいろいろを徹底解説

推薦する

Vue のすべてのカプセル化方法の簡単な概要

目次1. カプセル化API 2. グローバルツールコンポーネントを登録する3. グローバル関数をカプ...

docker tagとdocker pushの使い方の詳しい説明

Dockerタグの詳しい説明docker tag コマンドの使い方と、ローカルイメージを daocl...

HTML 要素に注釈を付けるときにクラスと ID のどちらが優れているかを分析する

Web ページには、非常に複雑な HTML 構造があります。CSS を使用して関連するスタイルを定義...

Centos7 ベースの Nginx Web サイト サーバーの構築の詳細説明 (仮想 Web ホストの構成を含む)

1. Nginx サービス基盤Nginx (エンジン x) は、パフォーマンスの最適化のために特別...

HTML ウェブページ作成のための 8 つの強力なテクニック

<br />作業を簡単に完了できる Web ページ作成ツールは数多くありますが、HTML...

Dockerを使用してクローンリポジトリを使用してGitイメージを構築する

概要私は 1 年以上 Docker を使用しています。最近、サービスをすばやくオーケストレーションし...

Dockerfile における ENV 命令の具体的な使用法の詳細な説明

1. Dockerfile 内の ENV 命令は、イメージの環境変数を定義するために使用されます。次...

Vue ミックスインの詳しい説明

目次ローカルミックスイングローバル ミックスイン要約するローカルミックスイン <テンプレート&...

自動ヘルスレポートを実現するDocker+Selenium方式

この記事では、ある大学の健康報告システムを例に、Web 側の自動化操作を完成させます。使用したテクノ...

Windows はリモート デスクトップが長時間自動的に切断されるのを防ぎます

Windows リモート デスクトップを使用してサーバーに接続したことがある人なら、リモート デスク...

Linux での Hbase のインストールと設定のチュートリアル

目次Linux での Hbase のインストールと設定1. Hbaseインストールパッケージをダウン...

SpringBoot プロジェクトの Docker クイック デプロイメントの紹介

1. Dockerをインストールするまず Linux 環境を開き、次のコマンドを入力してインストール...

HTML をホームページとして設定し、お気に入りに追加_Powernode Java Academy

IE ブラウザで「ホームページとして設定」および「お気に入りに追加」機能を実装する方法解決:指定さ...

jQueryとCSSを組み合わせてトップに戻る機能を実現

CSS操作 CS $("").css(名前|プロ|[,値|関数]) 位置$(&q...