Java注解
Annotation(注解)是JDK5.0及以后版本引入的。它可以用於創建文檔,跟蹤代碼中的依賴性,甚至執行基本編譯時檢查。注解是以‘@注解名’在代碼中存在的,根據注解參數的個數,我們可以將注解分為:標記注解、單值注解、完整注解三類。它們都不會直接影響到程序的語義,只是作為注解(標識)存在,我們可以通過反射機制編程實現對這些元數據(用來描述數據的數據)的訪問。另外,你可以在編譯時選擇代碼里的注解是否只存在於源代碼級,或者它也能在class文件中出現。
常用註解
在日常編程中,我們遇到的註解有@Override、@SuppressWarnings等等,@Override表示重寫父類的方法,@SuppressWarnings表示忽略警告信息。
用法如下:

package com.ares.Temp; /** * @author Ares */ public class T { @SuppressWarnings("unused") public static void test(){ int i; System.out.println("This is a test."); } @Override public String toString(){ return "Test Class"; } }
自定義註解
它類似於新創建一個接口類文件,但為了區分,我們需要將它聲明為@interface,下面,我們用代碼來演示。
package com.annotation.test; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface FruitColor { enum Color{RED,YELLOW,WHITE} Color fruitColor() default Color.RED; }
package com.annotation.test; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface FruitName { String value() default ""; }
package com.annotation.test; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface FruitProvider { int id() default 0; String user() default ""; String address() default ""; }
以上是定義的蘋果的相關信息,下面,我們開始使用上面定義的註解來進行具體的實現:
package com.annotation.test; import com.annotation.test.FruitColor.Color; public class Apple { @FruitName(value="FuShi Apple") private String fruitName; @FruitColor(fruitColor=Color.RED) private String fruitColor; @FruitProvider(id=1,user="Tom",address="China") private FruitProvider provider; }
上面的Apple類是使用我們自己定義的註解來對類成員進行修飾。接下來,我們獲取我們的註釋信息:
1 package com.annotation.test; 2 3 import java.lang.reflect.Field; 4 5 public class Test { 6 7 8 public static void getFruitInfo(String clas){ 9 try { 10 Class<?> cls = Class.forName(clas); 11 Field[] fields = cls.getDeclaredFields(); 12 13 for (Field field : fields) { 14 if(field.isAnnotationPresent(FruitName.class)==true){ 15 FruitName name = field.getAnnotation(FruitName.class); 16 System.out.println("Fruit Name:"+name.value()); 17 } 18 if(field.isAnnotationPresent(FruitColor.class)){ 19 FruitColor color = field.getAnnotation(FruitColor.class); 20 System.out.println("Fruit Color:"+color.fruitColor()); 21 } 22 if(field.isAnnotationPresent(FruitProvider.class)){ 23 FruitProvider Provider = field.getAnnotation(FruitProvider.class); 24 System.out.println("Fruit FruitProvider: ProviderID:"+Provider.id()+" Provider:"+Provider.user() +" ProviderAddress:"+Provider.address()); 25 } 26 } 27 28 29 } catch (ClassNotFoundException e) { 30 e.printStackTrace(); 31 } 32 } 33 34 public static void main(String[] args) { 35 getFruitInfo("com.annotation.test.Apple"); 36 } 37 38 }
輸出結果爲:
Fruit Name:FuShi Apple
Fruit Color:RED
Fruit FruitProvider: ProviderID:1 Provider:Tom ProviderAddress:China