一、 Java 註釋( Annotation ) :
1 ) @Override 註釋
該註釋僅應用於方法,用來指明被其註釋的方法必須重寫超類中的方法,否則會發生編譯錯誤。
2 ) @Deprecated 註釋
該註釋用於聲明元素已經過時,不鼓勵使用。如果堅持使用,可能會帶來潛在問題。如下例子:
import java.util.ArrayList;
import java.util.List;
public class AnnoSamp1 {
@Deprecated
public void method1(){}
public List method2(){
List list = new ArrayList();
list.add("007");
return list;
}
}
注:此處程序代碼見相冊中,有實際運行情況!
方法
method1()
已經被註釋爲過時方法,所以如果由另外一個程序調用了
AnnoSamp1
()類的
method1()
方法,編譯時會提示過時。
3 ) @SuppressWarnins 註釋
SuppressWarnins 註釋允許開發人員控制編譯器警告的發佈,例如泛型使所有的類型安全操作成爲可能,如果沒有使用泛型而存在類型安全問題,編譯器將會拋出警告。 SuppressWarnins 使用格式爲:
@SuppressWarnins( 參數名 )
參數表如下:
( 1 ) deprecated: 過時的類或方法
( 2 ) finally:finally 子句無法正常完成
( 3 ) fallthrough:switch 程序塊中沒有使用 break
( 4 ) serial: 類缺少 serialVersionUID
( 5 ) unchecked: 未經檢查的類型轉換
( 6 ) unused: 定義了但從未使用
( 7 ) all: 以上全部情況
4 ) @Target 註釋
Target 註釋用來限制註釋的使用範圍,其使用格式是:
@Target({ 應用類型 1 ,應用類型 2 , …….})
其中應用類型如下:
( 1 ) TYPE :類、接口、註釋或枚舉類型
( 2 ) FIELD :屬性,包括枚舉常量
( 3 ) METHOD :方法
( 4 ) PARAMETER :參數
( 5 ) CONSTRUCTOR :構造方法
( 6 ) LOCAL_VARIABLE :局部變量
( 7 ) ANNOTATION_TYPE :註釋類
( 8 ) PACKAGE :包
二、自定義註釋
可以爲自己創建的註釋類提供成員,例如:
Public @interface InTesting{
String value();
}
這是隻有一個成員的註釋(單成員註釋),可以這樣來使用它:
@InTesting(“This method returns all department info”)
Public void getMsg(){….}
由更簡便的使用方法:
@InTesting(“This method returns all department info”)
Public void getMsg(){…}
當然,註釋不只是單成員這麼簡單,可以更爲複雜些,例如:
Public @interface InTesting{
String author();
String description() default “Testing”;
float ver();
}
三、保留策略
Java 提供了 3 種保留策略:
1 ) RetentionPolicy.CLASS: 編譯後保留在 class 文件中,運行時忽略。
2 ) RetentionPolicy.RUNTIME: 編譯後保留在 class 文件中,運行時 Java 虛擬機可讀取。
3 ) RetentionPolicy.SOURCE: 只存在於源文件中,編譯後保留在 class 文件中 .
例如:
import java.lang.annotion.Target;
import java.lang.annotion.ElementType.METHOD;
import java.lang.annotion.Retention;
import java.lang.annotion.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@Target({METHOD})
public @interface InTesting{
String author();
String description() default "Testing";
float ver ();
}
四、讀取註釋
Java 的 java.lang.reflect 包中提供了 getAnnotations() 方法,以數組的形式返回註釋信息。該方法可用於類、方法、構造方法等類型的對象中。示例如下:
首先來編寫一個簡單的類 Message ,該類的兩個方法均被註釋:
public class Message{
@InTesting(author = "cg ",description = " 獲取備註信息 ",ver = 1.1f)
public void getMsg(){
System.out.println("get message info....");
}
@InTesting(author = "cg ",description = " 計算利潤率,測試中 ",ver = 1.2f)
public void calcProfitRat(){
System.out.println("Calculate...");
}
}
接下來編寫一個打印輸入 Message 類所有方法註釋信息的程序:
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
public class ReadAnno{
public static void main(String[] args ) throws SecurityException,NoSuchMethodException{
Class<Message> c = Message.class;// 獲得 Message 類的實例
Method[] m = c.getMethods(); // 獲取該類的全部方法
Annotation[] annotations;// 聲明註釋變量
for(Method method:m){
annotations = method.getAnnotations(); // 獲得當前方法的註釋信息
System.out.println(annotation);
}
}
}
程序運行後輸出結果如下:
@ cn.edu.sinomacro.coursemanag .InTesting(description= 獲取備註信息 ,author=cg ,ver =1.1)
@cn.edu.sinomacro.coursemanag.InTesting(description= 計算利潤率,測試中 ,author=cg ,ver =1.2)
注意: cn.edu.sinomacro.coursemanag 是自定義的包名。