java注解

注解是Java引入的一項提供了一種結(jié)構(gòu)化的,并且具有類型檢查能力的新功能,這使得程序員能夠為代碼加入元數(shù)據(jù),而不會導(dǎo)致代碼雜亂且難以閱讀。
??自從java有了注解,使得spring等框架變的更受歡迎了,它使我們的編碼體驗發(fā)生了巨大改變。
?? java中有一些自帶的注解,例如@Override,@SuppressWarnings等,但是,很多小伙伴不知道如何創(chuàng)建注解,這里我們就來了解一下。
??假如我們要創(chuàng)建一個@helloworld的注解,首先需要:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {}

其中需要使用元注解(即定義注解的注解,這是jdk定義好的)定義此注解的基本信息。@Target用來定義此注解將應(yīng)用于什么地方(方法或域)。@Rectetion用來定義該注解在哪一個級別可用,SOURCE(在源代碼中),CLASS(類文件),RUNTIME(運行時)。
??在空注解的基礎(chǔ)上加入兩個類似方法的定義:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UseCase {
    public int id();
    public String description() default "no description";
}
public class PasswordUtils {
    @UseCase(id = 47,description = "密碼必須包含數(shù)字")
    public boolean vaPass(String pass){
        return (pass.matches("\\w*\\d\\w*"));
    }
    @UseCase(id = 48)
    public String enPass(String pass){
        return new StringBuilder(pass).reverse().toString();
    }
    @UseCase(id = 49,description = "新密碼不能等于使用過的密碼")
    public boolean checkNPass(List<String> prevPass,String pass) {
        return !prevPass.contains(pass);
    }
    
    public static void main(String[] args) {
        PasswordUtils pu = new PasswordUtils();
        pu.vaPass("123");
    }
}

注解的元素在使用時表現(xiàn)為名-值對的形式,如果沒有使用id或description,那么將會用到其默認值(default)。id沒有默認值,應(yīng)該是不能沒有值的。

元注解

java里面目前內(nèi)置了四種元注解,專職負責(zé)注解其他的注解,一般程序員會定義自己的注解,并編寫自己的處理器來處理它們。
??四種元注解

四種元注解

編寫注解處理器

使用注解時很重要的一個部分就是創(chuàng)建與使用注解處理器。我們可以使用反射這類工具,java 還提供了一個外部工具apt來幫助程序員解析帶有注解的java源代碼。
??一個簡單的注解處理器

public class UseCaseTracker {
    public static void 
    trackUseCases(List<Integer> useCases,Class<?> cl) {
        for(Method m : cl.getDeclaredMethods()) {
            UseCase uc = m.getAnnotation(UseCase.class);
            if(uc != null) {
                System.out.println("Found Use Case:" + uc.id()
                +" " +uc.description());
                useCases.remove(new Integer(uc.id()));
            }
        }
        for(int i : useCases) {
            System.out.println("Warning: Missing use case-" + i);
        }
    }
    public static void main(String[] args) {
        List<Integer> useCases = new ArrayList<Integer>();
        Collections.addAll(useCases, 47,48,49,50);
        trackUseCases(useCases, PasswordUtils.class);
    }
}

getDeclaredMethods()方法返回類的方法。
??getAnnotation()方法返回指定類型的注解對象,在本文中就是UseCase。如果被注解的方法上沒有該類型的注解,則返回null值。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 什么是注解 注解對于開發(fā)人員來講既熟悉又陌生,熟悉是因為只要你是做開發(fā),都會用到注解(常見的@Override);...
    張明云閱讀 25,997評論 6 154
  • Java 中的注解(Annotation) 是一個很方便的特性在Spring當(dāng)中得到了大量的應(yīng)用 , 我們也可以開...
    _秋天閱讀 10,166評論 3 22
  • 內(nèi)容概要 Annotation的概念 Annotation的作用 Annotation的分類 系統(tǒng)內(nèi)置注解 元注解...
    DevinZhang閱讀 4,333評論 0 29
  • 我用十幾年的一事無成換來你一句一無是處。當(dāng)我要從頭開始的時候,做什么都很難,對于一個自信心瞬間傾到的人,我摸爬滾打...
    cici江閱讀 241評論 0 0
  • 我可以停止我的憂傷, 只要在人群中遇見你, 你還在時光的一瞥中微笑, 唱著我們早已忘記的歌曲。 我可以停止我的思想...
    釋迦干屎橛閱讀 420評論 2 3

友情鏈接更多精彩內(nèi)容