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のループ速度テストのいろいろを徹底解説

推薦する

Javascript デザインパターン プロトタイプ モードの詳細

目次1. プロトタイプモード例1例2例3 2. オブザーバーパターン1. プロトタイプモードプロトタ...

Springboot プロジェクトに動的にパラメータを渡すための Docker の実装方法

背景最近、Docker 初心者の友人から、毎回プロジェクト構成ファイルにハードコーディングしてサービ...

Vue3 の emitting と attr の違いの分析

目次結論は実践分析拡張機能要約する結論は親コンポーネントでカスタム イベントが定義されている場合、子...

Dockerコンテナを停止および削除できない問題の解決策

実行中のコンテナIDを見つける ドッカーps上記のコンテナの物理的な場所を見つける /var/lib...

CSSリンクと@importの違いの詳細な説明

HTML に CSS を追加するにはどうすればいいですか? HTML で CSS を設定する方法は ...

MySQL エラー 1290 (HY000) の解決方法

私は長い間問題に取り組み、文法上の問題を何度も確認しました。しかし、後でネットで調べてみたら、突然理...

Centos ベースイメージの作成方法

序文現在、私の会社で使用しているオペレーティングシステムはすべて CentOS7.4 で、アプリケー...

Redhat 8.0 システムのインストール方法に関するグラフィック チュートリアル (初心者には必須)

目次1. はじめに2. インストール01. 新しい仮想マシンを作成する02. システムをインストール...

マークアップ言語 - CSS レイアウト

123WORDPRESS.COM HTML チュートリアル セクションに戻るには、ここをクリックして...

MySQLプリコンパイル機能の詳細な説明

この記事では、MySQLのプリコンパイル機能について紹介します。具体的な内容は以下のとおりです。 1...

nginx 設定ファイルで環境変数を使用する方法

序文Nginx はパフォーマンスを重視して設計された HTTP サーバーです。Apache や li...

Windows 8 での MySQL 5.6.15 のインストールと設定方法のグラフィック チュートリアル

MySQLは私がとても気に入っているデータベースです。今日はWindows 8システムでインストール...

webpack-dev-server のコア概念とケースの詳細な説明

webpack-dev-server コアコンセプトWebpack の ContentBase と ...

JavaScript でプロパティハイジャックを実装する方法 defineProperty

目次序文記述子getとsetの詳細な説明オブジェクトの属性の乗っ取りオブジェクトのすべてのプロパティ...

VMware Workstation に Windows Server 2019 をインストールする (グラフィック チュートリアル)

キーの入力を求められた場合は、[キーがありません]を選択します。デスクトップエクスペリエンスを選択す...