一、先了解以下4個元注解
@Documented
具體來說是生成說明文檔時把類的解釋添加進去。
@Inherited 允許子類繼承父類中的注解
@Target 表示該注解用于什么地方,可能的值在枚舉類 ElemenetType 中
public enum ElementType {
TYPE, ?//給類(型)注解
FIELD, //給字段注解,不要忘了,字段可以是對象
METHOD, //給方法注解
PARAMETER, //給參數注解
CONSTRUCTOR, //給構造方法注解
LOCAL_VARIABLE, //給局部變量注解
ANNOTATION_TYPE,//給注解注解(這貌似把自己不當類來看)
PACKAGE, //給包注解
TYPE_PARAMETER, //不知道,等知道了我再寫在這里
TYPE_USE //這個也不知道
}
@Retention ?表示在什么級別保存該注解信息。可選的參數值在枚舉類型 RetentionPolicy 中
public enum RetentionPolicy {
SOURCE, //源碼狀態運行,
CLASS, //編譯類文件時運行
RUNTIME //運行時運行
}
二、再看一個Demo
注解定義
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(value = { ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface UserAnnotation {
public int id() default 0;
public String name() default "";
public int age() default 18;
public String gender() default "M";
}
public class User {
int id;
String name;
int age;
String gender;
public User(int id, String name, int age, String gender) {
this.id = id;
this.name = name;
this.age = age;
this.gender = gender;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
import java.lang.reflect.Field;
public class TestMain {
@UserAnnotation(age = 20, gender = "F", id = 2014, name = "zhangsan")//注解的使用
public Object obj;
public static void main(String[] args) throws Exception {
Field objField = TestMain.class.getField("obj");
UserAnnotation ua = objField.getAnnotation(UserAnnotation.class);//得到注解,起到了標記的作用
System.out.println(ua.age() + "," + ua.gender() + "," + ua.id() + "," + ua.name());
//***進一步操作的話,假設Object要指向一個User類,那么可以講注解的值給他
TestMain tm = new TestMain();
objField.set(tm, new User(ua.age(), ua.gender(), ua.id(), ua.name())); //不錯吧,將自己的信息送給obj,起到了附加信息的作用
//-----------請自由遐想吧~~,下面來說說注解怎么能獲得注解自己的注解-------------
Target t = ua.annotationType().getAnnotation(Target.class);
ElementType[] values = t.value();
//~~~~~~~~~~~~~~完了,再一次自由遐想吧~~~~~~~~~~~~~~
String words="瘋狂";
System.out.println(words);
}
}