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

推薦する

Linuxはデュアルネットワークカードボンドとドライバーインターフェースを使用する

債券とは何かNIC ボンドは、実稼働シナリオでよく使用されるテクノロジーです。複数の NIC を 1...

IDEA で Linux コマンドを使用する方法

Windows システムと比較して、Linux システムは多数の豊富なコマンドライン ツールを提供し...

Linux での nginx のインストール、展開、使用方法の詳細な説明

目次1. ダウンロード2. 展開3. Nginxログ関連の設定4. ファイルダウンローダーとして n...

Vueデータ監視の原理の詳細な説明

目次1. はじめにII. 監視対象2.1 なぜオブジェクトを監視する必要があるのですか? 2.2 デ...

Centos7 で keepalived ログを別のパスに設定する方法の詳細な説明

Keepalived のインストール: cd <keepalived_sourcecode_p...

MySQL 接続制御プラグインの紹介

目次1. 接続制御プラグイン(connection_control)の紹介1.1 connectio...

Web ページでパラメータ名によって ActiveX コントロールのプロパティに値を割り当てる例

コードをコピーコードは次のとおりです。 <HTML> <ヘッド> <T...

Linux で time(NULL) 関数と localtime() を使用して現在の時刻を取得する方法

time(); 関数関数プロトタイプ: time_t time(time_t *timer)関数の目...

理論の普及——ユーザーエクスペリエンス

1. 概念分析 1: UE ユーザー エクスペリエンス <br />英語ではユーザー エ...

この記事では、jsのデータ型とデータ構造の世界を紹介します。

目次1. 動的型付けとは何ですか? 2. データ型2.1 プリミティブ型 (6 つのプリミティブ型、...

Linux jdk のインストールと環境変数の設定チュートリアル (jdk-8u144-linux-x64.tar.gz)

最初にsudo suコマンドを使用して root アカウントに切り替えることをお勧めします。そうしな...

Vue を使用して Web ページのスクリーンショットを撮る方法をご存知ですか?

目次1. html2Canvasをインストールする2. 必要なVueコンポーネントを導入する3. ス...

JavaScriptはスタック構造の詳細なプロセスを実装する

目次1. スタック構造を理解する2. スタック構造のカプセル化3. 10進数を2進数に変換する1. ...

vue.js パッケージ化プロジェクトの後の空白ページの解決策

Vueに触れたばかりのパートナーの多くは、開発環境ではVueプロジェクトは正常であるが、パッケージ化...

MySQLとRedisでセカンダリキャッシュを実装する方法の詳細な説明

Redis の紹介Redis は完全にオープンソースで無料であり、BSD プロトコルに準拠しており、...