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都是用註解方便開發。