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";
    }

}

Override 和 SuppressWarnings

自定義註解

  它类似于新创建一个接口类文件,但为了区分,我们需要将它声明为 @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