これは、記事のカスタムアノテーションを実装するのが一番簡単でしょう

定義された注釈

@interfaceで定義されたノート

public @interface Log {
}
复制代码

それはほとんど道のキーワードとインタフェースの定義だが、1の前に@記号

Notesアプリケーション

上記実施形態のアプリケーションは、具体的に後に言えば、非常に単純なクラスにアノテーション又はよう@xxを添加する方法であります

public class Controller {
    @Log
    public void test(){
    }
}

@Log
public class Controller {
    public void test(){
    }
}

复制代码

元のメモ

メタ注釈:注釈注釈が定義されている、コメントにコメントに定義することができ、基本的な注釈です

@保持

ライフサイクルを説明するために使用ノート

@Retention(RetentionPolicy.SOURCE)ノートはコンパイルを廃棄し、ソース段階でのみ保持しました

@Retention(RetentionPolicy.CLASS)デフォルトのポリシー、注釈のみ行っビルドに時間が保持され、それがJVMにロードされることはありません。

@Retention(RetentionPolicy.RUNTIME)プログラムはまた、それを得ることができます実行されているので、プログラムが実行されている場合、注釈を保持することができ、それは、JVMにロードされます。

@Documented

文書化された注釈は、これがデフォルトで記録されたJavadocコメントが同様の記録ツールを持っていることを示しています。型宣言が文書化され注釈されている場合は、公開APIの一部となって指摘しています。

ターゲット注釈の役割を説明@Target

@Target(ElementType.TYPE)インターフェース、クラス、列挙、注釈

@Target(ElementType.FIELD)フィールド、列挙定数

@Target(ElementType.METHOD)方法

@Target(ElementType.PARAMETER)メソッドのパラメータ

@Target(ElementType.CONSTRUCTOR)コンストラクタ

@Target(ElementType.LOCAL_VARIABLE)ローカル変数

@Target(ElementType.ANNOTATION_TYPE)注解

@Target(ElementType.PACKAGE)包

@遺伝性の

@Inherited:あなたはこの注釈1にコメントを使用する場合は、クラスを使用し、これはまた、クラスの効果の1つのサブクラスに注意してください。例えば:

@Inherited
@Target(ElementType.METHOD)
public @interface Log {

}

@Log
public class testA(){}

public class testB() extends testA{}

复制代码

種皮は@Logこのコメントがあり、その後、TESTBクラス以上、この注釈@Logを適用します。

@Repeatable

例えば:

@Target(ElementType.METHOD)  
@Retention(RetentionPolicy.RUNTIME)
public @interface Logs {
      Log[] value();
}

@Repeatable(Logs.class)
public @interface Log{
     String descr() default "";
}

public class Controller {
    @Log(descr="描述1")
    @Log(descr="描述2")
    public void test(){

    }
}

public class LogRunner {
    public static void main(String []args) throws Exception{
        System.out.println("开始时间:"+new Date());
        Class classs=Controller.class;
        Method[] ms=classs.getMethods();
        for(Method method:ms){
            boolean flag=method.isAnnotationPresent(Logs.class);
            if(flag){
                Logs logs=method.getAnnotation(Logs.class);
                for(Log log:logs.value()){
                    System.out.println(log.descr());
                }
            }
        }
    }
}

复制代码

出力が出力されると、記述1、2について説明します。

カスタムアノテーションを実装します

最初のステップは、コメントを定義することです

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface Log {
    String methodName() default "defaultAMethod";
    String controller() default "defaultController";
    String descr() default  "defaultDescr";
}
复制代码

第二段階は、このコメントを適用しました

public class Controller {
    @Log
    public void test(){
        System.out.println("结束时间:"+new Date());
    }
}
复制代码

第3のステップは仕事を反映してこのコメントを作ることです

public class LogRunner {
    public static void main(String []args) throws Exception{
        System.out.println("开始时间:"+new Date());
        Class classs=Controller.class;
        Method[] ms=classs.getMethods();
        for(Method method:ms){
            boolean flag=method.isAnnotationPresent(Log.class);
            if(flag){
                Log log=method.getAnnotation(Log.class);
                System.out.println(log.methodName());
                System.out.println(log.descr());
                System.out.println(log.controller());
                method.invoke(classs.newInstance(),null);
            }
        }
    }
}
复制代码

輸出

画像

出力

上記のコメントの第2のステップは、デフォルト値を使用しない場合は、コードを変更します

public class Controller {
    @Log(methodName = "test",controller = "testController",descr = "测试")
    public void test(){
        System.out.println("结束时间:"+new Date());
    }
}
复制代码

これは、出力は以下となります

画像

出力

パーティーを見出し一握り、スカウトの女性と友人が私を許してください時に私を許して。

千覚、返送:社会的関心番号へようこそ百冊の早期アーキテクチャへのバックエンドの本をもたらしました。

おすすめ

転載: juejin.im/post/5dfde62e6fb9a0164f294c29