為Annotation註解添加各種屬性 – JAVA編程語言程序開發技術文章

我們知道 對於 註解來說的聲明和接口類似,那麼 我們當然也可以為其添加屬性  。
但是從Java語音規范中得知,對於註解的屬性類型 有限制 隻能是 八個原始類型  String類型  Enum類型  Annotation註解類型 以及Class類型,出瞭以上幾個類型之外 為註解添加屬性都會報錯
public  @interface  MyAnnotation
{
  String   name() ;//添加String類型的屬性
  int[]   arrayAttr() default {1,2,3,4,5};   //添加整形數組的屬性  並且提供默認值
   …….
}
這樣添加瞭屬性之後我們要使用註解就 需要給註解添加上屬性值瞭 如下
@MyAnnotation(name="xiaowei",arrayAttr={2,3,4,5}) 
聲明即可,如果屬性有默認值那麼   就可以不給有默認值的屬性賦值
在使用屬性的時候我們可以像調用方法一樣直接通過 註解對象調用屬性 即可  。。。。
 
下面代碼演示瞭 在註解中 添加 註解類型  字符串類型  枚舉類型 等 的屬性
 
1、一個枚舉TrafficLamp的聲明    TrafficLamp.java
package me.test;
public enum TrafficLamp
{
   RED {
 @Override
 public TrafficLamp  nextLamp() {
  return  GREEN ;
 }
}  ,GREEN {
 @Override
 public TrafficLamp  nextLamp() {
  return   YELLOW;
 }
} ,YELLOW { ;
 @Override
 public TrafficLamp  nextLamp() {
  return  RED ;
 }
}  ;
   public  abstract TrafficLamp nextLamp();
}
2、元註解的聲明  NewAnnotation.java
package me.test;
public @interface NewAnnotation
{  
 String name()  ;
}
class A
{}
3、MyAnnotation註解 的實現MuAnnotation.java
package me.test;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface MyAnnotation
{  
  String age() default "20" ;
  String name() ;
  int[]  arrayAttr() default {1,2,3,4,5,6}; 
  TrafficLamp lamp()  default TrafficLamp.RED;
  NewAnnotation an() default @NewAnnotation(name="xiaowei") ;
}
4、Main方法所在類   MyAnnotationTest.java
package me.test;
import java.lang.annotation.Annotation;
import java.util.Arrays;
@MyAnnotation(name = "xiaowei",age="45"  )
public class MyAnnotationTest

    public static void main(String []args)
    {
     if(MyAnnotationTest.class.isAnnotationPresent( MyAnnotation.class))
     {
       MyAnnotation an=(MyAnnotation)MyAnnotationTest.class.getAnnotation(MyAnnotation.class) ;
       System.out.println(an.name());
       System.out.println(an.age());
       System.out.println(an.arrayAttr().length);
       System.out.println( an.lamp().nextLamp().name() );
       System.out.println(an.an().name());
     }
    }
}

摘自 yue7603835的專欄

發佈留言