注解的語法比較簡單,除了@符號的使用以外,它基本上與java的固有語法一致,java內置了三種注解,定義在java.lang包中。
@Override 表示當前方法是覆蓋父類的方法。
@Deprecated 表示當前元素是不贊成使用的。
@SuppressWarnings 表示關閉一些不當的編譯器警告資訊。
下面是一個定義注解的實例
1. package Test_annotation;
2.
3. import java.lang.annotation.Documented;
4. import java.lang.annotation.Inherited;
5. import java.lang.annotation.Retention;
6. import java.lang.annotation.Target;
7. import java.lang.annotation.ElementType;
8. import java.lang.annotation.RetentionPolicy;
9.
10. /*
11. * 元注解@Target,@Retention,@Documented,@Inherited
12. *
13. * @Target 表示該注解用於什麼地方,可能的 ElemenetType 參數包括:
14. * ElemenetType.CONSTRUCTOR 構造器聲明
15. * ElemenetType.FIELD 域聲明(包括 enum 實例)
16. * ElemenetType.LOCAL_VARIABLE 區域變數聲明
17. * ElemenetType.METHOD 方法聲明
18. * ElemenetType.PACKAGE 包聲明
19. * ElemenetType.PARAMETER 參數聲明
20. * ElemenetType.TYPE 類,介面(包括注解類型)或enum聲明
21. *
22. * @Retention 表示在什麼級別保存該注解資訊。可選的 RetentionPolicy 參數包括:
23. * RetentionPolicy.SOURCE 注解將被編譯器丟棄
24. * RetentionPolicy.CLASS 注解在class文件中可用,但會被VM丟棄
25. * RetentionPolicy.RUNTIME VM將在運行期也保留注釋,因此可以通過反射機制讀取注解的資訊。
26. *
27. * @Documented 將此注解包含在 javadoc 中
28. *
29. * @Inherited 允許子類繼承父類中的注解
30. *
31. */
32. @Target(ElementType.METHOD)
33. @Retention(RetentionPolicy.RUNTIME)
34. @Documented
35. @Inherited
36. /*
37. * 定義注解 Test
38. * 注解中含有兩個元素 id 和 description
39. * description 元素 有預設值 "no description"
40. */
41. public @interface Test {
42. public int id();
43. public String description() default "no description";
44. }
下面是一個使用注解 和 解析注解的實例
1. package Test_annotation;
2.
3. import java.lang.reflect.Method;
4.
5. public class Test_1 {
6. /*
7. * 被注解的三個方法
8. */
9. @Test(id = 1, description = "hello method_1")
10. public void method_1() {
11. }
12.
13. @Test(id = 2)
14. public void method_2() {
15. }
16.
17. @Test(id = 3, description = "last method")
18. public void method_3() {
19. }
20.
21. /*
22. * 解析注解,將Test_1類 所有被注解方法 的資訊列印出來
23. */
24. public static void main(String[] args) {
25. Method[] methods = Test_1.class.getDeclaredMethods();
26. for (Method method : methods) {
27. /*
28. * 判斷方法中是否有指定注解類型的注解
29. */
30. boolean hasAnnotation = method.isAnnotationPresent(Test.class);
31. if (hasAnnotation) {
32. /*
33. * 根據注解類型返回方法的指定類型注解
34. */
35. Test annotation = method.getAnnotation(Test.class);
36. System.out.println("Test( method = " + method.getName()
37. + " , id = " + annotation.id() + " , description = "
38. + annotation.description() + " )");
39. }
40. }
41. }
42.
43. }
輸出結果如下:
Test( method = method_1 , id = 1 , description = hello method_1 )
Test( method = method_2 , id = 2 , description = no description )
Test( method = method_3 , id = 3 , description = last method )
沒有留言:
張貼留言