簡單Java註解
JDK5提供的簡單註解類型只有3個. 這三個都是用來預防錯誤或進行提醒的,分別是:
1.Override
2.Deprecated
3.Suppresswarnings
需要注意,JDK5(另一個說法,Tiger)實際上並沒有許多內建註解;相反,它允許核心Java支援註解特性的能力. JSR-175中嚴格規定它用來定義元資料功能. 需要由程式設計師編寫自訂的註解類型,其他JSR標準也編寫了一系列標準註解類型. 以下將用實例來深入講解這三個簡單註解.
Override 註解
Override 註解指明被註解的方法需要覆寫超類別中的方法.
如果某個方法使用了該註解,卻沒有覆寫超類中的方法(比如大小寫寫錯了,或者參數錯了,或者是子類自己定義的方法),編譯器就會產生一個錯誤.
(注意: JRE5中實作介面中的方法時不能使用Override註解,JRE6允許了,很多時候JRE5會報這個錯).
範例1示範了覆寫註解:
Java註解範例1:
複製代碼代碼如下:
public class Test_Override {
@Override
public String toString() {
return super.toString() + "測試使用'Override' 註解";
}
}
如果出現方法名字拼字錯誤會發生什麼? 例如,如果你將toString方法改名為"tostring"(全小寫),編譯時就會得到類似下面這樣的出錯訊息:
複製代碼代碼如下:
Compiling 1 source file to D:tempNew Folder (2)
TestJavaApplication1buildclasses
D:tempNew Folder (2)TestJavaApplication1srctest
myannotationTest_Override.java:24: method does not override
a method from its superclass
@Override
1 error
BUILD FAILED (total time: 0 seconds)
當然,Eclipse就會直接報紅叉.現在IDE發展的很好用,初學者不應該去折騰JDK的命令行了.
Deprecated 註解
這個註解顯示如果程式呼叫一個廢棄的(Deprecated,廢棄的,過時的)元素時,編譯器應該顯示警告訊息. 範例2顯示如何使用Deprecated 註解.
Java註解範例2
首先,建立一個類別,並像下面這樣將某個方法標明為廢棄:
複製代碼代碼如下:
public class Test_Deprecated {
@Deprecated
public void doSomething() {
System.out.println("測試使用棄用註解: 'Deprecated'");
}
}
接著,嘗試從另一個類別呼叫這個方法:
複製代碼代碼如下:
public class TestAnnotations {
public static void main(String arg[]) throws Exception {
new TestAnnotations();
}
public TestAnnotations() {
Test_Deprecated t2=new Test_Deprecated();
t2.doSomething();
}
本例中的doSomething()方法被宣告為廢棄的方法. 因此,一般情況下不應該呼叫這個方法. 在編譯Test_Deprecated.java 檔案時是不會有警告訊息的. 但在編譯TestAnnotations.java 時編譯器就會給予類似這樣的警告訊息(Eclipse 會有警告):
複製代碼代碼如下:
Compiling 1 source file to D:tempNew Folder
(2)TestJavaApplication1buildclasses
D:tempNew Folder
(2)TestJavaApplication1srctestmyannotation
TestAnnotations.java:27:
warning: [deprecation] doSomething() in
test.myannotation.Test_Deprecated has been deprecated
t2.doSomething();
1 warning
Suppresswarnings 註解
這個註解告訴編譯器應該屏蔽帶註解的元素和所有子元素的警告訊息. 會壓制一個元素集和子元素的所有警告訊息. 例如,假設你在一個class上使用了Suppresswarnings 註解壓住一個警告,在它的一個方法上用Suppresswarnings 註解來壓制另一個警告,則兩種警告都會在方法級別被壓制住. 請參見示例3.
Java註解範例3:
複製代碼代碼如下:
public class TestAnnotations {
public static void main(String arg[]) throws Exception {
new TestAnnotations().doSomeTestNow();
}
@SuppressWarnings({"deprecation"})
public void doSomeTestNow() {
Test_Deprecated t2 = new Test_Deprecated();
t2.doSomething();
}
}
在本例中,使用 @SuppressWarnings壓住了範例2中所示的deprecation警告訊息。因為該方法的這類警告被壓住了,所以你不會再看到"deprecation"警告.
注意: 在最內層的元素上使用該註解是比較好的. 因此,如果你只想在一個特定的方法上壓制一個警告,你應該在方法上標註,而不是在類上使用註解.
元註解(Meta-Annotations,Java註解類型)
元註解,實際上被稱為註解的註解,包含四種類型. 分別是:
1.Target
2.Retention
3.Documented
4.Inherited
Target 註解
Target註解顯示註解類型適用於哪種目標元素. 它包含下面的枚舉類型值:
1.@Target(ElementType.TYPE)―― 可以適用於任何類別的元素
2.@Target(ElementType.FIELD)―― 只適用於欄位或屬性
3.@Target(ElementType.METHOD)―― 只適用於方法的註解
4.@Target(ElementType.PARAMETER)―― 只適用於方法的參數
5.@Target(ElementType.CONSTRUCTOR)―― 只適用於建構子
6.@Target(ElementType.LOCAL_VARIABLE)―― 只適用於局部變數
7.@Target(ElementType.ANNOTATION_TYPE)―― 指明宣告類型本身就是一個註解類型
範例4演示了Target 註解:
Java註解範例4
首先,定義了一個名為Test_Target的註解類型,帶上@Target元註解,如下所示:
複製代碼代碼如下:
@Target(ElementType.METHOD)
public @interface Test_Target {
public String doTestTarget();
}
接下來,建立一個類別,它將使用Test_Target註解:
複製代碼代碼如下:
public class TestAnnotations {
public static void main(String arg[]) {
new TestAnnotations().doTestTarget();
}
// 在方法上使用註解,OK.
// 中間也可以不換行,換2行之類,Java忽略多餘的換行
@Test_Target(doTestTarget="Hello World !")
public void doTestTarget() {
System.out.printf("Testing Target annotation");
}
}
@Target(ElementType.METHOD) 註解表明該註解類型只能被用來註解方法. 如果你編譯這段程式碼,不會顯示警告訊息. 但是,如果將這個註解聲明到一個字串變數上,會發生什麼呢? 就像下面這樣:
複製代碼代碼如下:
public class TestAnnotations {
// 這是錯誤的做法,編譯不會通過,因為註解的Level不對.
// 元註解指明了只能註解方法,就不能用來註解屬性
@Test_Target(doTestTarget="Hello World !")
private String str;
public static void main(String arg[]) {
new TestAnnotations().doTestTarget();
}
public void doTestTarget() {
System.out.printf("Testing Target annotation");
}
}
唯一的變化就是註解聲明從方法級轉向字段級,這是不正確的. 因為你已經定義了註解@Test_Target 只適用在方法級,如果你嘗試編譯這個類,你可能會得到這樣的錯誤信息:
複製代碼代碼如下:
"TestAnnotations.java":
D:R_AND_DTestAnnotationsrctestmyannotation
TestAnnotations.java:16:
annotation type not applicable to this kind of declaration at line
16, column 0
@Test_Target(doTestTarget="Hello World !")
^
Error in javac compilation