我们知道 对于 注解来说的声明和接口类似 ,那么 我们当然也可以为其添加属性 。
但是从 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());
}
}
}