且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

为Annotation注解添加各种属性

更新时间:2022-08-13 08:22:41

我们知道 对于 注解来说的声明和接口类似 ,那么 我们当然也可以为其添加属性  。

但是从 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());
     }
    }
}