次のサンプル コードでは、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のループ速度テストのいろいろを徹底解説
目次1. MySQLアーキテクチャの分析1.1 コネクタ1.2 クエリキャッシュ1.3 アナライザー...
序文クエリ情報が複数のテーブルから取得される場合、クエリのためにこれらのテーブルを結合する必要があり...
序文MySQL では、EXPLAIN コマンドを使用して、テーブルの接続方法や SELECT ステー...
目次1. DateTimePickerの日付選択範囲は現在時刻とそれ以前です2. DateTimeP...
目次DockerにRedisをインストールする1. Redisイメージを見つける2. Redisイメ...
CentOS 8 に Jenkins をインストールするには、root アカウントまたは sudo ...
MYSQL でよく使用されるクエリ コマンド: mysql> select version()...
この記事では、音楽プレーヤーを実装するためのVue.jsの具体的なコードを参考までに共有します。具体...
問題の説明Centos7 をローカルにインストールして 3 つの仮想マシンを作成し、Swarm クラ...
必要な方はどなたでも参考にしてください。試してみて問題が見つかった場合は、メッセージを残してお知らせ...
この記事では、実際に発生した問題をもとに、git の設定に関する内容を紹介します。コマンド: git...
yum を使用してすべての依存関係を一緒にインストールできますが、–downloadonly –d...
この記事では、例を使用して、MySQL のデータベース間トランザクション XA 操作について説明しま...
問題を見つける最近、MySQL コマンドを使用して MySQL サーバーに接続したときに、以下のよう...
1. 複数の国境[1]背景: ボックスシャドウ、アウトライン使用シナリオの多様性を考慮すると、複数の...