次のサンプル コードでは、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 ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。 以下もご興味があるかもしれません:
|
<<: JavaScript 組み込みの日付と時刻の書式設定のサンプル コード
>>: 意外と知らないJSのループ速度テストのいろいろを徹底解説
この要件を受け取ったとき、Baidu は、CSS リンクの置き換え、className の変更、le...
目次1.配列を初期化する2. 配列の合計、最大値、最小値3. エラー値をフィルタリングする4. 論理...
目次序文SSHとは何かssh は何に使用されますか? sshの使い方ssh 再修正要約する序文ssh...
MySQL カスタム値は、値を保存するための一時的なコンテナです。サーバーへの接続がアクティブである...
設定ファイルを server.xml と content.xml に書き込みます。サーバーを再起動す...
問題の説明Ele.me UI のフレームワークでは、入力データは el-form であり、出力データ...
<iframe src=”test.jsp” width=”100″ height=”50″ ...
目次エラーのデモンストレーション計算により画像が変わらない場合は直接インポートするCSS変数による画...
1. DOM要素を挿入、更新、または削除するときに、適切な場合は要素にスタイルクラス名を追加します。...
導入最近、Docker の ARM バージョンがあることを知りました。 hub.docker.com...
領事の基本概念サーバーモードとクライアントモードサーバー モードとクライアント モードは、consu...
Linux がすべてのコマンドをサポートしていない場合はどうすればいいですか?すべてのLinuxコマ...
docker アタッチコマンドdocker attach [options] 容器実行中のコンテナに...
1. /etc/init.d ディレクトリに入ります: cd /etc/init.d 2. tomc...
CN2ラインとは何ですか? CN2 は、China Telecom Next Carrier Ne...