Java註解簡述

Java註解簡述

國慶假期前後,基本是看一下開源的項目,發現不少優秀的開源項目都用了註解和動態代理相關的知識,所以順帶有好好地研讀了一下註解和動態代理,加深了對註解和動態代理的認識。博客都差不多接近要斷了,前一段七七八八地看了各種東西,一直都沒有寫東西,懶惰了很多。整的現在很多東西都沒有做好,突然覺得不僅僅是專業學習,其他的各種東西也應該有點追求。力求生活精緻。

Java從JDK5開始引入了註解(Annotation),也稱元數據,它可以用於創建文檔,代碼依賴性跟蹤,甚至編譯時的基本檢查。註解基本格式是@註解名稱。經常遇到的一個例子如下:

@Override
public String toString(){
    return "annotation string";
}

Java註解可以應用到包,類,方法,字段,局部變量上面。另外Java可以通過反射去讀取註解的內容。

Java內置註解

Java內置了三個註解,定義在java.lang包裏面:

  • Override:重載檢查
  • Deprecated: 使用過時的代碼的提示
  • SuppressWarnings:提醒,像uncheck,serial等

這些個也都是我們經常使用的註解,特別是Override,在繼承的時候加上註解,能夠對繼承進行檢查。像本文第一段代碼就是使用了Override。下面這段就是Override的源碼:

    package java.lang;
    import java.lang.annotation.*;
    
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.SOURCE)
    public @interface Override {
    }

自定義註解

Java出了內置了註解,也同樣是允許自定義註解的。自定義註解也跟Override的實現完全一樣。比如說我們想要實現一個Hello註解,只需要使用如下代碼:

    package java.lang;
    import java.lang.annotation.*;
    
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Hello {
        String haha() default "ha";
        String haha1() default "ha1";
    }

這樣就可以像使用Override一樣使用Hello註解了。其中@interface是聲明一個註解,自動繼承了java.lang.annotation.Annotation接口,編譯器程序會完成其他部分,在定義註解時,不能繼承其他註解或接口。@Retention是用來設置作用範圍,默認時RetentionPolicy.CLASS,它也是一種保留範圍,CLASS保留在class文件中,但VM運行時不保存,RUNTIME保留在class,運行時可以反射讀取註解的值。

@Target是用來指定適用的元素種類。如果不添加的話,任何元素都能夠使用。註解裏面的方法是註解的變量,可以設置默認值,類型基本變量都可以。

讀取註解的值

註解的值可以在運行的時候讀取出來,只要@Retention設置爲RUNTIME就能夠被讀取出來了。不過讀取出來的具體方法就需要去了解下了。

比如我們使用之前定義的Hello註解

@Hello
class TestHello{
    @Hello(haha="haha")
    public void sayHello(){}
    
    @Hello(haha="hahastr")
    public void hello;
}

類註解

Class<TestHello> cl = TestHello.class
Hello h = cl.getAnnotation(Hello.class);
System.out.println(h.haha()+","+h.haha1());

函數註解

Class<TestHello> cl = TestHello.class
Method method = cl.getMethod("sayHello",new Class[0]);
Hello h = (Hello)method.getAnnotation(Hello.class);

字段,構造函數的使用方式都是一樣的。程序可以在運行的時候讀取註解

處理註解的工具APT

APT(Annotation Processing Tool)就是jdk在1.5提供的幫助註解處理過程的工具。它的作用是在編譯源文件之前,通過一個自定義的註釋處理器去解釋並處理源文件的註釋,並且由註釋處理器生成一些新的源文件,字節碼文件,或其他文本文件。APT也會對新的源文件進行處理,知道沒有新的源文件產生。

使用了註解的一些工具

現在很多開源第三方Android項目都是使用了註解,

像依賴注入庫Dagger就是使用了很多註解去實現注入,並且利用註解處理工具在編譯時生成輔助類,在運行時完成注入。

另外又比如ButterKnife,也是一種依靠注入的開源庫,不過ButterKnife是Android中通過id自動綁定java中的View變量與layout中描述的View的一個開源庫。

以及我前面看過的Retrofit,那是一個將Http訪問簡化成與ORM一樣的開源庫。很多第三方庫都使用註解來方便開發者使用,但是其中的原理還是應該瞭解一下。

Spring中用到的註解就更多了,以及很多ORM都是用註解方便開發。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章