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