簡單實現自定義注解


在Java中創建自定義注解

創建自定義注解與編寫接口很相似,除了它的接口關鍵字前有個@符號。
注意以下幾點:

·注解方法不能有參數。
·注解方法的返回類型局限於原始類型,字符串,枚舉,注解,或以上類型構成的數組。
·注解方法可以包含默認值。
·注解可以包含與其綁定的元注解,元注解為注解提供信息,有四種元注解類型:

  1. @Documented – 表示使用該注解的元素應被javadoc或類似工具文檔化,它應用於類型聲明,類型聲明的注解會影響客戶端對注解元素的使用。如果一個類型聲明添加了Documented注解,那么它的注解會成為被注解元素的公共API的一部分。

  2. @Target – 表示支持注解的程序元素的種類,一些可能的值有TYPE, METHOD, CONSTRUCTOR, FIELD等等。如果Target元注解不存在,那么該注解就可以使用在任何程序元素之上。

  3. @Inherited – 表示一個注解類型會被自動繼承,如果用戶在類聲明的時候查詢注解類型,同時類聲明中也沒有這個類型的注解,那么注解類型會自動查詢該類的父類,這個過程將會不停地重復,直到該類型的注解被找到為止,或是到達類結構的頂層(Object)。

  4. @Retention – 表示注解類型保留時間的長短,它接收RetentionPolicy參數,可能的值有SOURCE, CLASS, 以及RUNTIME。

以下是一個簡單自定義注解的實現過程:

首先創建自定義注解類Annotations,代碼如下:

package com.dalaoyang.test;

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;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Annotations {
    long time() default -1;
}

寫一個簡單的實現類:

package com.dalaoyang.test;


import java.util.Date;

/**
 * @author dalaoyang
 * @Description
 * @project java_custon_annotations
 * @package com.dalaoyang.test
 * @email 397600342@qq.com
 * @date 2018/3/27
 */
public class DoSomeThing {
    public void test() {
        System.out.println("執行自定義注解");
        System.out.println("執行自定義注解結束時間:"+new Date());

    }
}

然后寫一個使用注解的類:

package com.dalaoyang.test;


public class Test {

    private DoSomeThing doSomeThing= new DoSomeThing();


    @Annotations
    public void test(){
        doSomeThing.test();
    }

}

最后利用反射,使注解可以使用:

package com.dalaoyang.test;


import java.lang.reflect.Method;
import java.util.Date;


// 反射注解
public class AnnotationsRunner {
    public static void main(String[] args) throws Exception {
        System.out.println("執行自定義注解開始時間:"+new Date());
        Class clazz = Test.class;
        Method[] ms = clazz.getMethods();
        for (Method method : ms) {
            boolean flag = method.isAnnotationPresent(Annotations.class);
            if (flag) {
                method.invoke(clazz.newInstance(), null);
            }
        }
    }
}

執行AnnotationsRunner類中得main函數,可以看到控制台如下所示:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM