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

推薦する

CSS 変数に基づくテーマ切り替えに最適なソリューション (推奨)

この要件を受け取ったとき、Baidu は、CSS リンクの置き換え、className の変更、le...

24 の実用的な JavaScript 開発のヒント

目次1.配列を初期化する2. 配列の合計、最大値、最小値3. エラー値をフィルタリングする4. 論理...

sshとは何ですか?使い方は?どのような誤解があるのでしょうか?

目次序文SSHとは何かssh は何に使用されますか? sshの使い方ssh 再修正要約する序文ssh...

MySQLカスタム変数の概念と特徴

MySQL カスタム値は、値を保存するための一時的なコンテナです。サーバーへの接続がアクティブである...

Tomcat で server.xml と content.xml を変更した後の自動復元の問題の解決方法

設定ファイルを server.xml と content.xml に書き込みます。サーバーを再起動す...

要素 ui の el-table の列にさまざまなスタイルのデータを動的に実装する例

問題の説明Ele.me UI のフレームワークでは、入力データは el-form であり、出力データ...

iframe パラメータの説明と例

<iframe src=”test.jsp” width=”100″ height=”50″ ...

Vue ページでよりエレガントに画像を紹介する方法

目次エラーのデモンストレーション計算により画像が変わらない場合は直接インポートするCSS変数による画...

Vueのトランジションとアニメーションの深い理解

1. DOM要素を挿入、更新、または削除するときに、適切な場合は要素にスタイルクラス名を追加します。...

docker compose を使用して consul クラスタ環境を構築する例

領事の基本概念サーバーモードとクライアントモードサーバー モードとクライアント モードは、consu...

Linuxがすべてのコマンドをサポートしていない問題の解決策

Linux がすべてのコマンドをサポートしていない場合はどうすればいいですか?すべてのLinuxコマ...

Dockerコンテナアプリケーションログの表示方法

docker アタッチコマンドdocker attach [options] 容器実行中のコンテナに...

Linux システムで Tomcat を自動的に起動するための設定方法の紹介

1. /etc/init.d ディレクトリに入ります: cd /etc/init.d 2. tomc...

CN2、GIA、CIA、BGP、IPLC はどういう意味ですか?

CN2ラインとは何ですか? CN2 は、China Telecom Next Carrier Ne...