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

推薦する

MySQL では SQL ステートメントはどのように実行されますか?

目次1. MySQLアーキテクチャの分析1.1 コネクタ1.2 クエリキャッシュ1.3 アナライザー...

どのような種類の MYSQL 接続クエリを知っていますか?

序文クエリ情報が複数のテーブルから取得される場合、クエリのためにこれらのテーブルを結合する必要があり...

EXPLAIN を使って MySQL の SQL 実行プランを分析する方法

序文MySQL では、EXPLAIN コマンドを使用して、テーブルの接続方法や SELECT ステー...

Vue Element UIの使用時に遭遇した問題をまとめる

目次1. DateTimePickerの日付選択範囲は現在時刻とそれ以前です2. DateTimeP...

DockerにRedisコンテナをインストールするための実装手順

目次DockerにRedisをインストールする1. Redisイメージを見つける2. Redisイメ...

CentOS 8にJenkinsをインストールする方法

CentOS 8 に Jenkins をインストールするには、root アカウントまたは sudo ...

MySql 共通クエリコマンド操作リスト

MYSQL でよく使用されるクエリ コマンド: mysql> select version()...

Vue.jsは音楽プレーヤーを実装します

この記事では、音楽プレーヤーを実装するためのVue.jsの具体的なコードを参考までに共有します。具体...

Docker Swarm 外部検証ロードバランシングが機能しない場合の解決策

問題の説明Centos7 をローカルにインストールして 3 つの仮想マシンを作成し、Swarm クラ...

Vue 円形パーセンテージ プログレスバー コンポーネントの機能の実装

必要な方はどなたでも参考にしてください。試してみて問題が見つかった場合は、メッセージを残してお知らせ...

Gitlab実践チュートリアルでは、関連する設定操作にgit configを使用します。

この記事では、実際に発生した問題をもとに、git の設定に関する内容を紹介します。コマンド: git...

yum を使用して rpm と関連する依存関係をダウンロードして、docker をオフラインでインストールします。

yum を使用してすべての依存関係を一緒にインストールできますが、–downloadonly –d...

MySQL クロスデータベーストランザクション XA 操作の例

この記事では、例を使用して、MySQL のデータベース間トランザクション XA 操作について説明しま...

MySQLコマンドが中国語で入力できない問題の解決方法

問題を見つける最近、MySQL コマンドを使用して MySQL サーバーに接続したときに、以下のよう...

CSS で複数の境界線を実装するためのヒント

1. 複数の国境[1]背景: ボックスシャドウ、アウトライン使用シナリオの多様性を考慮すると、複数の...