java語言基礎--枚舉,註解,正則和反射
阿新 • • 發佈:2019-01-07
ota 獲取 -- tty ide 並不是 system ret 測試
註解
@Retention(RetentionPolicy.RUNTIME)//註解保留策略 public @interface MyAnno { String str(); int val(); }
@MyAnno(str = "測試註解",val = 100) public void test() { }
所有註解都只包含方法聲明,不能提供方法體。應用註解時,需要為註解成員提供值
註解的保留策略,java指定三種保留策略,它們被封裝到java.lang.annotation.RetentionPolicy枚舉中,
SOURCE ,只在源文件保留,編譯器會被拋棄
CLASS 在編譯時存儲到.class文件中,運行時不可通過jvm得到這些註解
RUNTIME 在編譯時存儲到.class文件中,運行時可通過jvm得到這些註解
因此,RUNTIME 是最永久的註解
使用反射在運行時獲取註解
@Retention(RetentionPolicy.RUNTIME)//註解保留策略 public @interface MyAnno { String str() default "OK"; int val() default 500; }
public class Test { @MyAnno(str = "測試註解",val = 100) //這裏不指定值得時候,將會使用默認值 public static void myMeth() { Test t = new Test(); try { Class<?> clazz = t.getClass(); Method method = clazz.getMethod("myMeth"); MyAnno anno = method.getAnnotation(MyAnno.class);//當註解策略不是RUNTIME時,這裏anno會得到null System.out.println(anno.str());//輸出 測試註解 System.out.println(anno.val());//輸出 100 } catch (NoSuchMethodException | SecurityException e) { e.printStackTrace(); } } public static void main(String[] args) { myMeth(); } }
先獲取當前對象,獲取Class對象 ,根據Class對象獲取當前Method,根據Method 獲取表明註解的值。
獲取所有註解
@Retention(RetentionPolicy.RUNTIME) public @interface MyAnno { String str(); int val(); }
@Retention(RetentionPolicy.RUNTIME) public @interface What { String desription(); }
@MyAnno(str="測試類註解",val=100) @What(desription="類描述") public class Meta2 { @MyAnno(str="測試方法註解",val=200) @What(desription="方法描述") public static void test() { Meta2 m= new Meta2(); try { Annotation[] annos = m.getClass().getAnnotations(); for (Annotation annotation : annos) { System.out.println(annotation); } // 輸出如下 T8是包名 // @T8.MyAnno(str=測試類註解, val=100) // @T8.What(desription=類描述) Method test = m.getClass().getMethod("test"); Annotation[] annos2 = test.getAnnotations(); for (Annotation annotation : annos2) { System.out.println(annotation); } // 輸出如下 T8是包名 // @T8.MyAnno(str=測試方法註解, val=200) // @T8.What(desription=方法描述) }catch (Exception e) { } } public static void main(String[] args) { test(); } }
單成員註解
@Retention(RetentionPolicy.RUNTIME) public @interface MySingle { String value() default "aaa";//單成員註解僅僅包含一個成員 ,假設只有一個成員,使用註解時就可以直接為該成員設置,而不需要指定成員名稱,前提是成員名稱必須是value }
public class Single { @MySingle("this is a single annotation")//這裏並沒有指定 value = public static void test() throws Exception{ Single s = new Single(); Class<?> clazz = s.getClass(); Method test = clazz.getMethod("test"); MySingle mySingle = test.getAnnotation(MySingle.class); System.out.println(mySingle.value());//輸出 this is a single annotation } public static void main(String[] args)throws Exception { test(); } }
單值註解的其他用法
@Retention(RetentionPolicy.RUNTIME) public @interface MySingle { String value() default "aaa";//這個仍然是單值成員 int other() default 999;//其他成員必須有默認值 }
public class Single { @MySingle("this is a single annotation")//這裏並沒有指定 value = public static void test() throws Exception{ Single s = new Single(); Class<?> clazz = s.getClass(); Method test = clazz.getMethod("test"); MySingle mySingle = test.getAnnotation(MySingle.class); System.out.println(mySingle.value());//輸出 this is a single annotation System.out.println(mySingle.other());//輸出 999 } public static void main(String[] args)throws Exception { test(); } }
java的內置註解
@Retention 只能用於註解其他註解 ,用於指定保留策略
@Documented 只能用於註解其他註解 ,用於通知某個工具 註解將被文檔化
@Target 只能用於註解其他註解 用於指定註解只能使用的場合,比如一下代碼
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD,ElementType.CONSTRUCTOR})//這裏的作用是指定MySingle 只能作用在域變量或者構造函數 public @interface MySingle { }
ElementType枚舉值如下表
@Inherited 只能用於註解其他註解 允許子類繼承父類的註解。
@Override 方法重寫註解
@Deprecated 過期註解
@FunctionalInterface 函數式接口註解,用於指定一個接口是一個函數式接口(並不是必須條件,該接口僅僅是提供信息)
@SuppressWarnings 抑制編譯器的警告註解
java語言基礎--枚舉,註解,正則和反射