Annotation之自定義
定義Annotation的語法:
Public @interface Annotation的名稱{}
如:public @interface Override
public @interface MyAnnotation {
}
任何一個自定的Anntation都是繼承了java.lang.annotation.Annotation接口
一個Annotation如果要想起作用,則肯定要依靠反射機制,通過反射可以取得在一個方法上聲明的Annotation的全部內容。
具體實例
自定義Annotation:MyAnnotation
- import java.lang.annotation.Documented;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- @Target(ElementType.CONSTRUCTOR)
- @Retention(RetentionPolicy.RUNTIME)
- @Documented
- public @interface MyAnnotation {
- public String name() default "singsong";
- }
1. @Target(ElementType.CONSTRUCTOR)
@Target指示註釋類型所適用的程序元素的種類。如果註釋類型聲明中不存在 Target 元註釋,則聲明的類型可以用在任一程序元素上。如果存在這樣的元註釋,則編譯器強制實施指定的使用限制。參數是ElementType: java.lang.annotation.ElementType
定義:public enum ElementTypeextends Enum<ElementType>是枚舉類型
ElementType.CONSTRUCTOR代表此Annotation必須聲明在構造方法聲明的上面,而不能寫在任何的method{}(方法)或者是field(屬性)的上方。
@Target: 表示該註解可以用於什麼地方。可用ElementType枚舉類型主要有:
TYPE : 類、接口或enum聲明
FIELD: 域(屬性)聲明
METHOD: 方法聲明
PARAMETER: 參數聲明
CONSTRUCTOR: 構造方法聲明
LOCAL_VARIABLE:局部變量聲明
ANNOTATION_TYPE:註釋類型聲明
PACKAGE: 包聲明
2.@Retention(RetentionPolicy.RUNTIME)
@Retention指示註釋類型的註釋要保留多久。如果註釋類型聲明中不存在 Retention 註釋,則保留策略默認爲 RetentionPolicy.CLASS。 只有元註釋類型直接用於註釋時,Target 元註釋纔有效。如果元註釋類型用作另一種註釋類型的成員,則無效。
Retention設爲了RUNTIME,代表此annotation的具體實現可以在運行時用類反射來實現
RetentionPolicy定義:public enum RetentionPolicyextends Enum<RetentionPolicy>屬於枚舉類型
可用RetentionPolicy枚舉類型主要有:
SOURCE: 註解將被編譯器丟棄。
CLASS : 註解在class文件中可能。但會被VM丟棄。
RUNTIME: VM將在運行時也保存註解(如果需要通過反射讀取註解,則
使用該值)。
3. @Documented
@Documented: 將此註解包含在Javadoc中。
4. Annotation需要聲明:public @interface MyAnnotation{***}
使用自定義的MyAnnotation
- public class Person {
- @MyAnnotation(name = "The person's name is singsong")
- Person() {
- }
- public String name;
- }
使用java反射機制來實現MyAnnotation
- import java.lang.reflect.Method;
- public class TestMyAnnotation {
- public static void main(String[] args) throws Exception {
- Class<Person> c = Person.class;
- Method method = c.getMethod("getName");
- MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);
- System.out.println(myAnnotation.name());
- }
- }
運行結果:
The person's name is singsong