java註解

 註解(Annotation) 爲我們在代碼中天界信息提供了一種形式化的方法,是我們可以在稍後

某個時刻方便地使用這些數據(通過 解析註解 來使用這些數據)。

註解的語法比較簡單,除了@符號的使用以外,它基本上與java的固有語法一致,java內置了三種

註解,定義在java.lang包中。

@Override 表示當前方法是覆蓋父類的方法。

@Deprecated 表示當前元素是不贊成使用的。

@SuppressWarnings表示關閉一些不當的編譯器警告信息。

下面是一個定義註解的實例

Java代碼 複製代碼 收藏代碼
  1. package Test_annotation;
  2. import java.lang.annotation.Documented;
  3. import java.lang.annotation.Inherited;
  4. import java.lang.annotation.Retention;
  5. import java.lang.annotation.Target;
  6. import java.lang.annotation.ElementType;
  7. import java.lang.annotation.RetentionPolicy;
  8. /*
  9. * 元註解@Target,@Retention,@Documented,@Inherited
  10. *
  11. * @Target 表示該註解用於什麼地方,可能的 ElemenetType 參數包括:
  12. * ElemenetType.CONSTRUCTOR 構造器聲明
  13. * ElemenetType.FIELD 域聲明(包括 enum 實例)
  14. * ElemenetType.LOCAL_VARIABLE 局部變量聲明
  15. * ElemenetType.METHOD 方法聲明
  16. * ElemenetType.PACKAGE 包聲明
  17. * ElemenetType.PARAMETER 參數聲明
  18. * ElemenetType.TYPE 類,接口(包括註解類型)或enum聲明
  19. *
  20. * @Retention 表示在什麼級別保存該註解信息。可選的 RetentionPolicy 參數包括:
  21. * RetentionPolicy.SOURCE 註解將被編譯器丟棄
  22. * RetentionPolicy.CLASS 註解在class文件中可用,但會被VM丟棄
  23. * RetentionPolicy.RUNTIME VM將在運行期也保留註釋,因此可以通過反射機制讀取註解的信息。
  24. *
  25. * @Documented 將此註解包含在 javadoc 中
  26. *
  27. * @Inherited 允許子類繼承父類中的註解
  28. *
  29. */
  30. @Target(ElementType.METHOD)
  31. @Retention(RetentionPolicy.RUNTIME)
  32. @Documented
  33. @Inherited
  34. /*
  35. * 定義註解 Test
  36. * 註解中含有兩個元素 id 和 description
  37. * description 元素 有默認值 "no description"
  38. */
  39. public @interface Test {
  40. public int id();
  41. public String description() default "no description";
  42. }
package Test_annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
import java.lang.annotation.RetentionPolicy;

/*
 * 元註解@Target,@Retention,@Documented,@Inherited
 * 
 *     @Target 表示該註解用於什麼地方,可能的 ElemenetType 參數包括:
 *         ElemenetType.CONSTRUCTOR 構造器聲明
 *         ElemenetType.FIELD 域聲明(包括 enum 實例)
 *         ElemenetType.LOCAL_VARIABLE 局部變量聲明
 *         ElemenetType.METHOD 方法聲明
 *         ElemenetType.PACKAGE 包聲明
 *         ElemenetType.PARAMETER 參數聲明
 *         ElemenetType.TYPE 類,接口(包括註解類型)或enum聲明
 *         
 *     @Retention 表示在什麼級別保存該註解信息。可選的 RetentionPolicy 參數包括:
 *         RetentionPolicy.SOURCE 註解將被編譯器丟棄
 *         RetentionPolicy.CLASS 註解在class文件中可用,但會被VM丟棄
 *         RetentionPolicy.RUNTIME VM將在運行期也保留註釋,因此可以通過反射機制讀取註解的信息。
 *         
 *     @Documented 將此註解包含在 javadoc 中
 *     
 *     @Inherited 允許子類繼承父類中的註解
 *   
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
/*
 * 定義註解 Test
 * 註解中含有兩個元素 id 和 description
 * description 元素 有默認值 "no description"
 */
public @interface Test {
	public int id();
	public String description() default "no description";
}

下面是一個使用註解 和 解析註解的實例

Java代碼 複製代碼 收藏代碼
  1. package Test_annotation;
  2. import java.lang.reflect.Method;
  3. public class Test_1 {
  4. /*
  5. * 被註解的三個方法
  6. */
  7. @Test(id = 1, description = "hello method_1")
  8. public void method_1() {
  9. }
  10. @Test(id = 2)
  11. public void method_2() {
  12. }
  13. @Test(id = 3, description = "last method")
  14. public void method_3() {
  15. }
  16. /*
  17. * 解析註解,將Test_1類 所有被註解方法 的信息打印出來
  18. */
  19. public static void main(String[] args) {
  20. Method[] methods = Test_1.class.getDeclaredMethods();
  21. for (Method method : methods) {
  22. /*
  23. * 判斷方法中是否有指定註解類型的註解
  24. */
  25. boolean hasAnnotation = method.isAnnotationPresent(Test.class);
  26. if (hasAnnotation) {
  27. /*
  28. * 根據註解類型返回方法的指定類型註解
  29. */
  30. Test annotation = method.getAnnotation(Test.class);
  31. System.out.println("Test( method = " + method.getName()
  32. + " , id = " + annotation.id() + " , description = "
  33. + annotation.description() + " )");
  34. }
  35. }
  36. }
  37. }
package Test_annotation;

import java.lang.reflect.Method;

public class Test_1 {
	/*
	 * 被註解的三個方法
	 */
	@Test(id = 1, description = "hello method_1")
	public void method_1() {
	}

	@Test(id = 2)
	public void method_2() {
	}

	@Test(id = 3, description = "last method")
	public void method_3() {
	}

	/*
	 * 解析註解,將Test_1類 所有被註解方法 的信息打印出來
	 */
	public static void main(String[] args) {
		Method[] methods = Test_1.class.getDeclaredMethods();
		for (Method method : methods) {
			/*
			 * 判斷方法中是否有指定註解類型的註解
			 */
			boolean hasAnnotation = method.isAnnotationPresent(Test.class);
			if (hasAnnotation) {
				/*
				 * 根據註解類型返回方法的指定類型註解
				 */
				Test annotation = method.getAnnotation(Test.class);
				System.out.println("Test( method = " + method.getName()
						+ " , id = " + annotation.id() + " , description = "
						+ annotation.description() + " )");
			}
		}
	}

}
輸出結果如下:

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 )
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章