1. 程式人生 > >自定義註解,jdk註解,jdk1.8新增註解。

自定義註解,jdk註解,jdk1.8新增註解。

1.自定義註解:
public @interfase Test{
//沒有預設值
String name();
//列舉型註解,並賦予預設值
public enum Course{
CHINESE,
MATH
};
Course course() defalut Course.MATH;
}


例如:  @Test(name="張三", course=Test.Course.MATH)
public void helloWord(){} 


2.使用jdk定義註解:
用 @Target 指定ElementType屬性
public enum ElementType {
   // 用於類,介面,列舉,但不用於列舉值。
   TYPE,
   // 欄位上,包括列舉值
   FIELD,
   // 方法,不包括構造方法
   METHOD,
   // 方法的引數
   PARAMETER,
   // 構造方法
   CONSTRUCTOR,
   // 本地變數或catch語句
   LOCAL_VARIABLE,
   // 用於註解
   ANNOTATION_TYPE,
   // Java包
   PACKAGE
   //泛型,1.8新增
   TYPE_PARAMETER,
   //任意類型別,1.8新增
   TYPE_USE
}
jdk1.8新增註解使用示例:
例1:註解定義:@Target(ElementType.TYPE_PARAMETER)
public @interface Annotation1 {}
註解使用:public class Test<@Annotation1 T>{}


例2:註解定義:@Target(ElementType.TYPE_USE)
public @interface Annotation2 {}
註解使用:@Annotation2
public class Test{
@Annotation2 String text;
List<@Annotation1 Object> list = new ArrayList<>();
}


3.註解保持性:
用 @Retention 指定RetentionPolicy 屬性


public enum RetentionPolicy {
  // 此型別會被編譯器丟棄,不會儲存到class檔案中
  SOURCE,
  // 此型別註解會保留在class檔案中,但JVM會忽略它
  CLASS,
  // 此型別註解會保留在class檔案中,JVM會讀取它
  RUNTIME
}


4.支援文件化:
@Documented
public @interface Greeting {}
注意:如果用該註解則RetentionPolicy必須設定為RUNTIME。


5.繼承:
  讓該註解可以被繼承,可以作用到子類。
@Inherited
public @interface Greeting {}


6.獲取註解的方法:
public class AnnotationReadTest {
   public static void main(String[] args) throws Exception {
// 獲取Test類物件
Class c = Class.forName("com.sun.Test");
// 獲取該類所有方法
Method[] methods = c.getDeclaredMethods();
// 遍歷方法
for (Method method : methods) {
   // 獲取方法上面的註解
   Annotation[] annotations = method.getDeclaredAnnotations();
   // 遍歷註解
   for (Annotation annotation : annotations) {
System.out.println("方法名為:" + method.getName() + ",方法對應的註解為:" + annotation.annotationType().getSimpleName());
//獲取該註解的所有變數
Method[] meths = annotation.annotationType().getDeclaredMethods();
// 遍歷每個註解的變數
for (Method m : meths) {
   System.out.println("註解的變數名為:" + m.getName());
}
   }
}
   }
}
另外:
Class.getDeclaredFields()和Class.getFields()的區別:
Class.getDeclaredFields()獲取該類所有的欄位,與修飾符無關。和Class.getDeclaredMethods方法相同。
Class.getFields()獲取該類以及該類所繼承的父類所有public修飾符修飾的欄位。和Class.getMethods方法相同。