次のサンプル コードでは、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. カプセル化API 2. グローバルツールコンポーネントを登録する3. グローバル関数をカプ...
Dockerタグの詳しい説明docker tag コマンドの使い方と、ローカルイメージを daocl...
#include <asm/io.h> #define ioremap(cookie,...
Web ページには、非常に複雑な HTML 構造があります。CSS を使用して関連するスタイルを定義...
1. Nginx サービス基盤Nginx (エンジン x) は、パフォーマンスの最適化のために特別...
<br />作業を簡単に完了できる Web ページ作成ツールは数多くありますが、HTML...
概要私は 1 年以上 Docker を使用しています。最近、サービスをすばやくオーケストレーションし...
1. Dockerfile 内の ENV 命令は、イメージの環境変数を定義するために使用されます。次...
目次ローカルミックスイングローバル ミックスイン要約するローカルミックスイン <テンプレート&...
この記事では、ある大学の健康報告システムを例に、Web 側の自動化操作を完成させます。使用したテクノ...
Windows リモート デスクトップを使用してサーバーに接続したことがある人なら、リモート デスク...
目次Linux での Hbase のインストールと設定1. Hbaseインストールパッケージをダウン...
1. Dockerをインストールするまず Linux 環境を開き、次のコマンドを入力してインストール...
IE ブラウザで「ホームページとして設定」および「お気に入りに追加」機能を実装する方法解決:指定さ...
CSS操作 CS $("").css(名前|プロ|[,値|関数]) 位置$(&q...