Annotation翻譯為中文即為註解,意思就是提供除了程式本身邏輯外的額外的資料資訊。 Annotation對於標註的程式碼沒有直接的影響,它不可以直接與標註的程式碼產生交互,但其他元件可以使用這些資訊。
Annotation資訊可以被編譯進class文件,也可以保留在Java 虛擬機器中,以便在執行時可以取得。甚至對於Annotation本身也可以加Annotation。
類,方法,變數,參數,套件都可以加Annotation。
@Override 重載父類別中方法@Deprecated 被標註的方法或型別已不再推薦使用
@SuppressWarnings阻止編譯時的警告訊息。其需要接收一個String的陣列作為參數。 可供使用的參數有:
unchecked
#path
#@Retention
確定Annotation被儲存的生命週期, 需要接收一個Enum物件RetentionPolicy作為參數。
public enum RetentionPolicy { /** * Annotations are to be discarded by the compiler. */ SOURCE, /** * Annotations are to be recorded in the class file by the compiler * but need not be retained by the VM at run time. This is the default * behavior. */ CLASS, /** * Annotations are to be recorded in the class file by the compiler and * retained by the VM at run time, so they may be read reflectively. * * @see java.lang.reflect.AnnotatedElement */ RUNTIME }
@Documented 文檔化
#@Target
表示該Annotation可以修飾的範圍,接收一個Enum物件EnumType的數組作為參數。public enum ElementType { /** Class, interface (including annotation type), or enum declaration */ TYPE, /** Field declaration (includes enum constants) */ FIELD, /** Method declaration */ METHOD, /** Parameter declaration */ PARAMETER, /** Constructor declaration */ CONSTRUCTOR, /** Local variable declaration */ LOCAL_VARIABLE, /** Annotation type declaration */ ANNOTATION_TYPE, /** Package declaration */ PACKAGE }
@Inherited
該Annotation可以影響到被標註的類別的子類別。 自訂AnnotationJSE5.0以後我們可以自訂Annotation。下面就是一個簡單的例子。@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MethodAnnotation { }
public class Person { public void eat() { System.out.println("eating"); } @MethodAnnotation public void walk() { System.out.print("walking"); } }
Class<Person> personClass = Person.class; Method[] methods = personClass.getMethods(); for(Method method : methods){ if (method.isAnnotationPresent(MethodAnnotation.class)){ method.invoke(personClass.newInstance()); } }
walking
@Target(ElementType.TYPE) public @interface personAnnotation { int id() default 1; String name() default "bowen"; }
@personAnnotation(id = 8, name = "john") public class Person { public void eat() { System.out.println("eating"); } @MethodAnnotation public void walk() { System.out.print("walking"); } }
介面,Java的反射物件類別Class,Constructor,Field,Method以及Package都實作了這個介面。這個介面用來表示目前在Java虛擬機器中運作的被加上了annotation的程式元素。透過這個介面可以使用反射讀取annotation。 AnnotatedElement介面可以存取被加上RUNTIME標記的annotation,對應的方法有getAnnotation,getAnnotations,isAnnotationPresent。由於Annotation類型被編譯和儲存在二進位檔案中就像class一樣,所以可以像查詢普通的Java物件一樣查詢這些方法傳回的Annotation。
Annotation的廣泛使用Annotation被廣泛用於各種JunitJunit是非常著名的單元測試框架,使用Junit的時候需要接觸大量的annotation。
@AfterClass:在該測試類別中的所有的測試方法執行完後調用,只被執行一次(被標註的方法必須是static)
Spring 號稱配置地獄,Annotation也不少。
@Service 給service類別加註解
#@Repository 給DAO類別加註解
# @Component 給元件類別加註解
@Autowired 讓Spring自動組裝bean
@Transactional 設定事物
@Scope 設定物件存活範圍
@Controller 為控制器類別加註解
@RequestMapping url路徑對應
Null
被以上是詳解Java Annotation特性的掌握的詳細內容。更多資訊請關注PHP中文網其他相關文章!