次のサンプル コードでは、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. プロトタイプモード例1例2例3 2. オブザーバーパターン1. プロトタイプモードプロトタ...
背景最近、Docker 初心者の友人から、毎回プロジェクト構成ファイルにハードコーディングしてサービ...
目次結論は実践分析拡張機能要約する結論は親コンポーネントでカスタム イベントが定義されている場合、子...
実行中のコンテナIDを見つける ドッカーps上記のコンテナの物理的な場所を見つける /var/lib...
HTML に CSS を追加するにはどうすればいいですか? HTML で CSS を設定する方法は ...
私は長い間問題に取り組み、文法上の問題を何度も確認しました。しかし、後でネットで調べてみたら、突然理...
序文現在、私の会社で使用しているオペレーティングシステムはすべて CentOS7.4 で、アプリケー...
目次1. はじめに2. インストール01. 新しい仮想マシンを作成する02. システムをインストール...
123WORDPRESS.COM HTML チュートリアル セクションに戻るには、ここをクリックして...
この記事では、MySQLのプリコンパイル機能について紹介します。具体的な内容は以下のとおりです。 1...
序文Nginx はパフォーマンスを重視して設計された HTTP サーバーです。Apache や li...
MySQLは私がとても気に入っているデータベースです。今日はWindows 8システムでインストール...
webpack-dev-server コアコンセプトWebpack の ContentBase と ...
目次序文記述子getとsetの詳細な説明オブジェクトの属性の乗っ取りオブジェクトのすべてのプロパティ...
キーの入力を求められた場合は、[キーがありません]を選択します。デスクトップエクスペリエンスを選択す...