java內置了三種註解,定義在java.lang包中。
@Override 表示當前方法是覆蓋父類的方法。
@Deprecated 表示當前元素是不贊成使用的。
@SuppressWarnings表示關閉一些不當的編譯器警告信息。
以下介紹SuppressWarnings的一些參數
1、deprecation 使用了不贊成使用的類或方法時的警告
2、unchecked 執行了未檢查的轉換時警告
3、fallthrough 當使用switch操作時case後未加入break操作,而導致程序繼續執行其他case語句時出現的警告
4、path 當設置一個錯誤的類路徑、源文件路徑時出現的警告
5、serial 當在可序列化的類上缺少serialVersionUID定義時的警告
6、fianally 任何finally子句不能正常完成時警告
7、all 關於以上所有情況的警告
接下來利用一個註解實例來體驗註解的處理過程
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";
}
下面是一個使用註解和解析註解的實例
package al.annotation;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
public class Test_1 {
@Test(id=1,description="m1")
public void method_1() {
}
@Test(id=2,description="m2")
public void method_2() {
}
@Test(id=3,description="m3")
public void method_3() {
}
public static void main(String[] args) {
try {
Method[] me = Class.forName("al.annotation.Test_1").getMethods();
for( Method m:me){
Annotation[] ann = m.getAnnotations();
for(Annotation a:ann){
System.out.println(((Test)a).id());
System.out.println(((Test)a).description());
}
}
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
輸出結果
1
m1
2
m2
3
m3