JAVA註解介紹
前言
在我們的日常學習和編寫項目的時候可能會遇到一些寫在類、方法上或者是變量上的註解,比如:
@Componet
public class Hello{
@Override
public String toString(){
return "";
}
}
這些註解有的可以幫助我們解決很多的問題,比如:@Override幫我們解決方法是否是重寫的,Spring中的@Compoent幫我們把類注入IOC容器,AOP提供的註解簡單就完成了切面的增強…
爲什麼一個簡單註解可以解決這麼多的問題?
這次我就對註解進行一個簡單的入門幫大家簡單瞭解一下註解魅力!!
一個大佬寫的有關注解的博客:傳送門
正文
註解基礎知識點
定義:註解(Annotation),也叫元數據
。一種代碼級別的說明
。它是JDK1.5及以後版本引入的一個特性,與類、接口、枚舉
是在同一個層次。它可以聲明在包、類、字段、方法、局部變量、方法參數等的前面,用來對這些元素進行說明,註釋。
注意:百度百科其實說的比較明白了註解其實是對元素進行說明的,其實就和註釋一樣。它本身並不具備各種邏輯功能
,比如@Override的源代碼:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
這整個頭就是註解
了:
注意:
- 註解就和一個類一樣,
既可以沒有屬性也可以沒有功能
,但一般這種情況幾乎沒有。 - 註解的功能不一定被定義域註解域中(可以理解爲類的方法不在本類中),這個要是情況而定
- 註解內部的屬性的類型只支持
基本數據類型、String、枚舉
,支持在內部創建枚舉。
-
註解(Annotations)的四大元註解
上述的@Documented @Inherited @Target(ElementType.METHOD,) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation {}
@Documented
、@Inherited
、@Target
、@Retention
四個註解就是元註解,我們所有自定義的註解一般都繞不開它們。-
@Target:
此註解的取值將影響註解的使用地點
,是類註解還是方法註解等。當去只取一個的時候直接填寫值即可,多個的時候以value={}
的數組形式填寫。可取的值
ElementType.TYPE:用於描述類、接口或enum聲明
ElementType.FIELD:用於描述實例變量
ElementType.METHOD
ElementType.PARAMETER
ElementType.CONSTRUCTOR
ElementType.LOCAL_VARIABLE
ElementType.ANNOTATION_TYPE 另一個註釋
ElementType.PACKAGE 用於記錄java文件的package信息 -
@Retention:
此註解的取值將影響註解的生命週期
,換句話說就是註解在什麼時候被銷燬,這將影響到註解的功能。
可取的值
,只能選擇其一
RetentionPolicy.SOURCE : 在編譯階段丟棄。這些註解在編譯結束之後就不再有任何意義,所以它們不會寫入字節碼。
RetentionPolicy.CLASS : 在類加載的時候丟棄。在字節碼文件的處理中有用。註解默認使用這種方式。
RetentionPolicy.RUNTIME : 始終不會丟棄,運行期也保留該註解,因此可以使用反射機制讀取該註解的信息。我們自定義的註解通常使用這種方式。- @Documented:
此註解表示是否將該註解的信息加入java文檔 - @Inherited:
定義該註釋和子類的關係
-
實踐
這個例子只是註解的簡單入門使用,會加上註解的功能,會涉及到反射的用法,但是代碼結構簡單。代碼的大致結構也是按照上一篇博客給出的鏈接所編寫
// 註解定義
@Target(value = {ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
public enum FLAG{TRUE, FLASE}
public enum STATUS{BEFORE, ING, AFTER}
public String Author() default "lxx";
public FLAG Flag() default FLAG.FLASE;
public STATUS Status();
}
// 註解功能類 定義了註解功能
public class LoadMyAnnotation {
public static void LoadMyAnnotationA(){
// 獲取含有註解的類的Class
Class myannotation = ImpClass.class;
for (Method method : myannotation.getMethods()){
// 這個方法使用了泛型處理
MyAnnotation temp = method.getAnnotation(MyAnnotation.class);
if(temp != null){
System.out.println("Method Name" + method.getName());
System.out.println("Autor:" + temp.Author());
System.out.println("Flag:" + temp.Flag());
System.out.println("Status:" + temp.Status());
}
}
}
}
// 註解使用類
public class ImpClass {
@MyAnnotation(Author = "假人", Flag = MyAnnotation.FLAG.TRUE, Status = MyAnnotation.STATUS.BEFORE)
public void Helloword(){
System.out.println("helloword");
}
}
// Main方法測試類
public class Client{
public static void main(String[] args) throws Exception {
// 加載註解 會輸出ImpClass註解中定義的屬性和"helloword"
LoadMyAnnotation.LoadMyAnnotationA();
// 調用 沒有任何的變化
ImpClass impClass = new ImpClass();
impClass.Helloword();
}
}
總結
這篇博客所介紹關於註解的部分僅僅是個入門,在JAVA龐大的開源和商業框架中,註解的種類和功能千遍萬化,本文章僅僅是入門前的臺階,希望大家能拋去浮躁認真學習。