Java自定义注解的定义与使用
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 {</span><span style="color: rgba(0, 0, 255, 1)">enum</span><span style="color: rgba(0, 0, 0, 1)"> Color{RED,YELLOW,WHITE} Color fruitColor() </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> 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() </span><span style="color: rgba(0, 0, 255, 1)">default</span> ""<span style="color: rgba(0, 0, 0, 1)">;
}
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 {</span><span style="color: rgba(0, 0, 255, 1)">int</span> id() <span style="color: rgba(0, 0, 255, 1)">default</span> 0<span style="color: rgba(0, 0, 0, 1)">; String user() </span><span style="color: rgba(0, 0, 255, 1)">default</span> ""<span style="color: rgba(0, 0, 0, 1)">; String address() </span><span style="color: rgba(0, 0, 255, 1)">default</span> ""<span style="color: rgba(0, 0, 0, 1)">;
}
以上是定義的蘋果的相關信息,下面,我們開始使用上面定義的註解來進行具體的實現:
package com.annotation.test;import com.annotation.test.FruitColor.Color;
public class Apple {
@FruitName(value</span>="FuShi Apple"<span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String fruitName; @FruitColor(fruitColor</span>=<span style="color: rgba(0, 0, 0, 1)">Color.RED) </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String fruitColor; @FruitProvider(id</span>=1,user="Tom",address="China"<span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> 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