次のサンプル コードでは、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のループ速度テストのいろいろを徹底解説
債券とは何かNIC ボンドは、実稼働シナリオでよく使用されるテクノロジーです。複数の NIC を 1...
Windows システムと比較して、Linux システムは多数の豊富なコマンドライン ツールを提供し...
目次1. ダウンロード2. 展開3. Nginxログ関連の設定4. ファイルダウンローダーとして n...
目次1. はじめにII. 監視対象2.1 なぜオブジェクトを監視する必要があるのですか? 2.2 デ...
Keepalived のインストール: cd <keepalived_sourcecode_p...
目次1. 接続制御プラグイン(connection_control)の紹介1.1 connectio...
コードをコピーコードは次のとおりです。 <HTML> <ヘッド> <T...
time(); 関数関数プロトタイプ: time_t time(time_t *timer)関数の目...
1. 概念分析 1: UE ユーザー エクスペリエンス <br />英語ではユーザー エ...
目次1. 動的型付けとは何ですか? 2. データ型2.1 プリミティブ型 (6 つのプリミティブ型、...
最初にsudo suコマンドを使用して root アカウントに切り替えることをお勧めします。そうしな...
目次1. html2Canvasをインストールする2. 必要なVueコンポーネントを導入する3. ス...
目次1. スタック構造を理解する2. スタック構造のカプセル化3. 10進数を2進数に変換する1. ...
Vueに触れたばかりのパートナーの多くは、開発環境ではVueプロジェクトは正常であるが、パッケージ化...
Redis の紹介Redis は完全にオープンソースで無料であり、BSD プロトコルに準拠しており、...