ホームページ Java &#&チュートリアル 指定したパッケージ内のすべてのカスタム アノテーションを取得します

指定したパッケージ内のすべてのカスタム アノテーションを取得します

Jun 23, 2017 pm 03:26 PM
指定 注釈 カスタマイズ 得る

リフレクションはクラスパスをスキャンすることでメタデータにインデックスを付け、実行時にこれらのメタデータをクエリできるようにします。また、プロジェクト内の複数のモジュールのメタデータ情報を保存および収集することもできます。

リフレクションを使用して、指定したパッケージの下にあるカスタマイズされたコントローラーと RequestMapping アノテーションをすばやくスキャンします。最初に @Controller アノテーションが付けられたクラスをスキャンし、次にこれらのクラスの下で @RequestMapping アノテーションが付けられたメソッドを取得してから、Java リフレクション メソッドを呼び出します。アノテーションが付けられたメソッドを呼び出します。 RequestMapping を使用してアノテーション付きの情報を出力します。

Maven プロジェクトのインポート

<dependency>
    <groupId>org.reflections</groupId>
    <artifactId>reflections</artifactId>
    <version>0.9.10</version>
</dependency>
ログイン後にコピー

アノテーション パッケージの下で 2 つのアノテーションがカスタマイズされています。

Controller.java:

package annotationTest.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)// 注解会在class字节码文件中存在,在运行时可以通过反射获取到
@Retention(RetentionPolicy.RUNTIME)//定义注解的作用目标**作用范围字段、枚举的常量/方法
@Documented//说明该注解将被包含在javadoc中
public @interface Controller {
    String value() default "";
}
ログイン後にコピー

RequestMapping.java

package annotationTest.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface RequestMapping {
    String value() default "";

    /**
     * 是否为序列号
     *
     * @return
     */
    boolean id() default false;

    /**
     * 字段名称
     *
     * @return
     */
    String name() default "";

    /**
     * 字段描述
     *
     * @return
     */
    String description() default "";
}
ログイン後にコピー

RequestMapping アノテーション メソッドを格納するオブジェクトはモデル パッケージの下で定義されます

ExecutorBean.java

package annotationTest.model;

import java.lang.reflect.Method;

public class ExecutorBean {
    private Object object;

    private Method method;

    public Object getObject() {
        return object;
    }

    public void setObject(Object object) {
        this.object = object;
    }

    public Method getMethod() {
        return method;
    }

    public void setMethod(Method method) {
        this.method = method;
    }
}
ログイン後にコピー

いくつかのクラスはサービス パッケージの下で定義されます。カスタム コントローラー アノテーションを使用するクラスが 2 つあります

SunService.java

package annotationTest.service;

import annotationTest.annotation.Controller;
import annotationTest.annotation.RequestMapping;

@Controller
public class SunService {
    @RequestMapping(id = true, name = "test1", description = "sun测试1", value = "/test1")
    public void test1() {
        System.out.println("SunService->test1()");
    }

    @RequestMapping(id = true, name = "test2", description = "sun测试2", value = "/test2")
    public void test2() {
        System.out.println("SunService->test2()");
    }
}
ログイン後にコピー

MoonService.java

package annotationTest.service;

import annotationTest.annotation.Controller;
import annotationTest.annotation.RequestMapping;

@Controller
public class MoonService {
    @RequestMapping(id = true, name = "moon测试3", description = "/test3", value = "/test3")
    public void test3() {
        System.out.println("MoonService->test3()");
    }

    @RequestMapping(id = true, name = "moon测试4", description = "/test4", value = "/test4")
    public void test4() {
        System.out.println("MoonService->test4()");
    }
}
ログイン後にコピー

Stars.java

package annotationTest.service;

import annotationTest.annotation.RequestMapping;

public class Stars {
    @RequestMapping(id = true, name = "test1", description = "stars测试1", value = "/test1")
    public void test1() {
        System.out.println("Stars->test1()");
    }
}
ログイン後にコピー

ツール クラスは、パッケージをスキャンしてカスタマイズを取得するために util パッケージの下に定義されています アノテーション付きクラスおよびメソッド

AnnoManageUtil.java

package annotationTest.util;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import annotationTest.annotation.Controller;
import annotationTest.annotation.RequestMapping;
import annotationTest.model.ExecutorBean;
import org.reflections.Reflections;

public final class AnnoManageUtil {

    /**
     * 获取指定文件下面的RequestMapping方法保存在mapp中
     *
     * @param packageName
     * @return
     */
    public static Map<String, ExecutorBean> getRequestMappingMethod(String packageName) {
        Reflections reflections = new Reflections(packageName);
        Set<Class<?>> classesList = reflections.getTypesAnnotatedWith(Controller.class);

        // 存放url和ExecutorBean的对应关系
        Map<String, ExecutorBean> mapp = new HashMap<String, ExecutorBean>();
        for (Class classes : classesList) {
            //得到该类下面的所有方法
            Method[] methods = classes.getDeclaredMethods();

            for (Method method : methods) {
                //得到该类下面的RequestMapping注解
                RequestMapping requestMapping = method.getAnnotation(RequestMapping.class);
                if (null != requestMapping) {
                    ExecutorBean executorBean = new ExecutorBean();
                    try {
                        executorBean.setObject(classes.newInstance());
                    } catch (InstantiationException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                    executorBean.setMethod(method);
                    mapp.put(requestMapping.value(), executorBean);

                }
            }
        }
        return mapp;
    }

}
ログイン後にコピー

以下はテストクラスです

package annotationTest.test;

import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import annotationTest.annotation.Controller;
import annotationTest.annotation.RequestMapping;
import annotationTest.model.ExecutorBean;
import annotationTest.util.AnnoManageUtil;

public class Test {
    public static void main(String[] args) {
        List<Class<?>> classesList = null;
        classesList = AnnoManageUtil.getPackageController("annotationTest.service", Controller.class);
        Map<String, ExecutorBean> mmap = new HashMap<String, ExecutorBean>();
        AnnoManageUtil.getRequestMappingMethod(classesList, mmap);
        ExecutorBean bean = mmap.get("/test1");

        try {
            bean.getMethod().invoke(bean.getObject());
            RequestMapping annotation = bean.getMethod().getAnnotation(RequestMapping.class);
            System.out.println("注解名称:" + annotation.name() + "\t注解描述:" + annotation.description());
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}
ログイン後にコピー

それを実行して取得します:

指定したパッケージ内のすべてのカスタム アノテーションを取得します

その他

  1. リフレクションを使用して次のメタデータ情報をクエリします:

    Reflections は、Google の Guava ライブラリと Javassist ライブラリに依存しています。

  • 特定の型のすべてのサブタイプを取得します

  • 特定の注釈でマークされたすべての型/メンバー変数を取得し、注釈パラメータのマッチングをサポートします。

  • 正規表現を使用して、一致するすべてのリソースファイルを取得します

  • メソッドを使用して、すべての特定のシグネチャ (パラメータ、パラメータの注釈、戻り値を含む) を取得します

  • 注釈を使用してクラス/メソッド/メンバー変数などを装飾しますその後、これらのアノテーションは単独では有効になりません (もちろん、アノテーションの定義時に @Retention (RetentionPolicy.RUNTIME) 変更が使用された場合に限ります)。 JVM はクラス ファイルをロードします。クラス ファイルに保存された注釈は実行時に表示されるため、それを解析できます)。 . このインターフェイスはすべての親インターフェイス用です。

  • java5 は、プログラム内で注釈を受け入れることができるプログラム要素を表す AnnotatedElement インターフェースを java.lang.reflect パッケージに追加しました。

  • AnnotatedElement インターフェースの実装クラスは、Class (クラス要素)、Field です。 (クラスのメンバー変数要素)、メソッド (クラスのメソッド要素)、パッケージ (パッケージ要素)、それぞれの実装クラスは、アノテーションを受け入れることができるプログラム要素の型を表します。

  • この方法で必要なのは、Class、Method、Filed、および AnnotatedElement インターフェースを実装するその他のクラスのインスタンスを取得し、インスタンス オブジェクトを通じてクラス内のメソッドを呼び出すことだけです (AnnotatedElement インターフェースの抽象メソッドのオーバーライド)。 ) を取得する これで、必要なアノテーション情報が得られました。

  • Class クラスのインスタンスを取得するには 3 つの方法があります:

  • オブジェクトを使用して getClass() メソッドを呼び出し、Class インスタンスを取得します
    • クラスの静的な forName() メソッドを使用します。 Class クラスを作成し、クラス名を使用して Class インスタンスを取得します

    • .class を使用して、次のような Class インスタンスを取得します。 class name.class

    • AnnotatedElement インターフェースによって提供される抽象メソッド (これらのメソッドは でオーバーライドされます)このインターフェースの実装クラス):
  • < ;T extends Annotation> T getAnnotation(Class< T> annotationClass)< T extends Annotation> は、A の型が Annotation のみであることを示します。 Annotation のタイプまたはサブクラス。
  • 関数: プログラム要素に存在する指定された型の注釈を返します。この型の注釈が存在しない場合は、null を返します

    • Annotation[] getAnnotations()

      関数: この要素に存在するすべての注釈を返します。 、この要素に定義された注釈 (継承) は表示されません。 (この要素に注釈がない場合、長さ 0 の配列が返されます。)

    • < T extends Annotation> T getDeclaredAnnotation(Class < 指定されたタイプの注釈を使用してプログラム要素を直接変更します (継承された注釈は無視されます)。このタイプの注釈が存在しない場合は、null を返します。

    • Annotation[] getDeclaredAnnotations()
      機能: この要素に直接存在するすべての注釈を返します。このメソッドは、継承された注釈を無視します。 (この要素に直接アノテーションが存在しない場合は、長さ 0 の配列が返されます。)

    • boolean isAnnotationPresent(Class annotationClass)
      関数: 指定されたタイプのアノテーションが存在するかどうかを判断します。プログラム要素。存在する場合は true を返し、存在しない場合は false を返します。

    • <T extends Annotation> T[] getAnnotationsByTpye(Class annotationClass)
      機能: Java8 では反復アノテーション関数が追加されているため、プログラム要素を変更し、型を指定する複数のアノテーションを取得するには、このメソッドを使用する必要があります。

    • T[] getDeclaredAnnotationsByTpye(ClassannotationClass)
      機能: Java8 では繰り返しアノテーション関数が追加されるため、プログラム要素を直接変更して指定する複数のアノテーションを取得するには、このメソッドを使用する必要があります。タイプ。 。

    クラスは、getMethod()、getField()、および getConstructor() メソッド (およびその他のメソッド) を提供し、これらのメソッドはそれぞれ、メソッド、フィールド変数、およびコンストラクター型のオブジェクトを返します。 。

    以上が指定したパッケージ内のすべてのカスタム アノテーションを取得しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

    リアルなヌード写真を作成する AI 搭載アプリ

    AI Clothes Remover

    AI Clothes Remover

    写真から衣服を削除するオンライン AI ツール。

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    Video Face Swap

    Video Face Swap

    完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

    ホットツール

    メモ帳++7.3.1

    メモ帳++7.3.1

    使いやすく無料のコードエディター

    SublimeText3 中国語版

    SublimeText3 中国語版

    中国語版、とても使いやすい

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境

    ドリームウィーバー CS6

    ドリームウィーバー CS6

    ビジュアル Web 開発ツール

    SublimeText3 Mac版

    SublimeText3 Mac版

    神レベルのコード編集ソフト(SublimeText3)

    Netflix でカスタム アバターをすばやくセットアップする方法 Netflix でカスタム アバターをすばやくセットアップする方法 Feb 19, 2024 pm 06:33 PM

    Netflix のアバターは、ストリーミング ID を視覚的に表現したものです。ユーザーはデフォルトのアバターを超えて自分の個性を表現できます。 Netflix アプリでカスタム プロフィール写真を設定する方法については、この記事を読み続けてください。 Netflix でカスタム アバターをすばやく設定する方法 Netflix には、プロフィール写真を設定する機能が組み込まれていません。ただし、ブラウザに Netflix 拡張機能をインストールすることでこれを行うことができます。まず、Netflix 拡張機能のカスタム プロフィール画像をブラウザにインストールします。 Chrome ストアで購入できます。拡張機能をインストールした後、ブラウザで Netflix を開き、アカウントにログインします。右上隅にあるプロフィールに移動し、をクリックします

    Eclipseでショートカットキー設定をカスタマイズする方法 Eclipseでショートカットキー設定をカスタマイズする方法 Jan 28, 2024 am 10:01 AM

    Eclipse でショートカット キーの設定をカスタマイズするにはどうすればよいですか?開発者にとって、ショートカット キーをマスターすることは、Eclipse でコーディングする際の効率を向上させるための鍵の 1 つです。強力な統合開発環境として、Eclipse は多くのデフォルトのショートカット キーを提供するだけでなく、ユーザーが独自の好みに応じてショートカット キーをカスタマイズすることもできます。この記事では、Eclipseでショートカットキーの設定をカスタマイズする方法と具体的なコード例を紹介します。 Eclipseを開く まず、Eclipseを開いて次のように入力します。

    Googleセキュリティコードはどこで入手できますか Googleセキュリティコードはどこで入手できますか Mar 30, 2024 am 11:11 AM

    Google Authenticator はユーザー アカウントのセキュリティを保護するために使用されるツールであり、そのキーは動的検証コードを生成するために使用される重要な情報です。 Google Authenticator のキーを忘れて、セキュリティ コードでしか認証できない場合は、この Web サイトの編集者が Google セキュリティ コードの入手先について詳しく説明しますので、お役に立てれば幸いです。詳細を知る ユーザーは以下を読み続けてください。まず電話の設定を開き、設定ページに入ります。ページを下にスクロールして Google を見つけます。 Googleページに移動し、「Googleアカウント」をクリックします。アカウント ページに入り、確認コードの下にある [表示] をクリックします。パスワードを入力するか、指紋を使用して身元を確認します。 Google セキュリティ コードを取得し、そのセキュリティ コードを使用して Google の ID を確認します。

    JUnit フレームワークのテスト メソッドにアノテーションはどのように使用されますか? JUnit フレームワークのテスト メソッドにアノテーションはどのように使用されますか? May 06, 2024 pm 05:33 PM

    JUnit フレームワークのアノテーションは、テスト メソッドの宣言と構成に使用されます。主なアノテーションには、@Test (テスト メソッドの宣言)、@Before (テスト メソッドの実行前に実行されるメソッド)、@After (テスト メソッドの後に実行されるメソッド) があります。が実行される)、@ BeforeClass (すべてのテスト メソッドが実行される前に実行されるメソッド)、@AfterClass (すべてのテスト メソッドが実行された後に実行されるメソッド)、これらのアノテーションは、テスト コードを整理して簡素化し、テスト コードの信頼性を向上させるのに役立ちます。明確な意図と構成を提供することで、読みやすさと保守性を向上させます。

    PHP コードドキュメントの王様: PHPDoc の上級ガイド PHP コードドキュメントの王様: PHPDoc の上級ガイド Mar 02, 2024 am 08:43 AM

    はじめに: PHPDoc は、理解しやすく有益なドキュメントを作成する PHP コードのコメント標準です。 PHPDoc では、特定のコメント タグを使用することで、開発者が関数、クラス、メソッド、その他のコード要素に関する重要な詳細を提供できるようになります。この高度なガイドでは、PHPDoc を詳しく説明し、その機能を実証し、効果的な文書化戦略を提供します。構文とタグ: PHPDoc コメントは二重スラッシュ (//) または複数行コメント (/**/) で始まります。一般的なアノテーション タグをいくつか示します。 @param: 関数またはメソッドのパラメータを定義します。 @return: 関数またはメソッドの戻り値を指定します。 @throws: 関数またはメソッドによってスローされる可能性のある例外について説明します。 @var: クラスの属性またはインスタンスを定義します

    ediusカスタム画面レイアウトの操作手順 ediusカスタム画面レイアウトの操作手順 Mar 27, 2024 pm 06:50 PM

    1. 下の図はediusのデフォルトの画面レイアウトです EDIUSのデフォルトのウィンドウレイアウトは横レイアウトのため、シングルモニタ環境では多くのウィンドウが重なってプレビューウィンドウがシングルウィンドウモードになります。 2. メニューバーの[表示]から[デュアルウィンドウモード]を有効にすると、プレビューウィンドウに再生ウィンドウと録音ウィンドウを同時に表示できます。 3. [表示メニューバー > ウィンドウレイアウト > 一般] でデフォルトの画面レイアウトに戻すことができます。また、ウィンドウをドラッグして好みのレイアウトにし、[表示 > ウィンドウ レイアウト > 現在のレイアウトを保存 > 新規作成] をクリックすると、自分に合ったレイアウトをカスタマイズして、よく使う画面レイアウトとして保存することもできます。ポップアップ [現在のレイアウトを保存] レイアウト] 小さなウィンドウにレイアウト名を入力し、OK をクリックします

    Jackson ライブラリのアノテーションは、JSON のシリアル化と逆シリアル化をどのように制御しますか? Jackson ライブラリのアノテーションは、JSON のシリアル化と逆シリアル化をどのように制御しますか? May 06, 2024 pm 10:09 PM

    Jackson ライブラリのアノテーションは、JSON のシリアル化と逆シリアル化を制御します。 シリアル化: @JsonIgnore: プロパティを無視します @JsonProperty: 名前を指定します @JsonGetter: get メソッドを使用します @JsonSetter: set メソッドを使用します Deserialization: @JsonIgnoreProperties: プロパティ @ JsonProperty を無視します:名前を指定 @JsonCreator: コンストラクターを使用 @JsonDeserialize: カスタム ロジック

    簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 Jan 05, 2024 pm 06:08 PM

    JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

    See all articles