首页 > 代码库 > 自定义annotation

自定义annotation

自定义annotation格式:

技术分享

定义简单annotation:

public @interface MyDefaultAnnotationArrayParam{
}

使用简单annotation:

@MyDefaultAnnotationArrayParam
class Demo{
};

此时表示在Demo类上使用annotation。

 

还可以向annotation中设置内容,使用变量接收参数。

public @interface MyDefaultAnnotationSingleParam{
    public String value() ;    // 接收设置的内容
}

在使用的时候,必须清楚指明变量的内容

@MyDefaultAnnotationSingleParam("李兴华")
class Demo{
};

或者可以使用明确标记,表示内容赋给哪个参数。

@MyDefaultAnnotationSingleParam(value="http://www.mamicode.com/李兴华")
class Demo{
};

以上参数是赋值给value属性的,

既然可以赋值给一个参数,也可赋值给多个参数。

例如对于这个annotation

public @interface MyDefaultAnnotationMoreParam{
    public String key() ;
    public String value() ;    // 接收设置的内容
}

在使用的时候需要设置两个参数,一个是key,一个是value。

@MyDefaultAnnotationMoreParam(key="MLDN",value="http://www.mamicode.com/李兴华")
class Demo{
};

也可以设置一个数组进去

public @interface MyDefaultAnnotationArrayParam{
    public String[] value() ;    // 接收设置的内容
}

接收内容本身应该是一个数组,类似之前的SuppressWarnings。

@MyDefaultAnnotationArrayParam(value=http://www.mamicode.com/{"MLDN","李兴华"})
class Demo{
};

以上全部annotation有一个特点,所有使用的时候使用注释的时候设置上去。

也可以为参数设置默认内容,在声明的时候使用Default即可。

public @interface MyDefaultAnnotationValue{
    public String key() default "MLDN" ;    // 指定好了默认值
    public String value() default "李兴华" ;    // 指定好了默认值
}

当使用的时候,就可以不再设置内容了。不报错,如下。

@MyDefaultAnnotationValue
class Demo{
};

 

 

操作中,对于一个annotation而言,有时候会固定其取值范围,只能取固定几个值此时需要依靠枚举

首先定义一个枚举:

public enum MyName{    // 定义枚举类型
    MLDN,LXH,LI ;
}

以后的annotation的取值只能从这三个值中取。

使用:

public @interface MyDefaultAnnotationEnum{
    public MyName name() default MyName.LXH ;    // 指定默认值,默认值是通过一个枚举变量设置,注意此时的name()的类型是枚举类型
}

以上annotation已经设置好了一个枚举中的内容作为默认值,那么外部使用此annotation的时候,也需要从枚举中固定取值

@MyDefaultAnnotationEnum(name=MyName.LI)    //因为annotation使用的是默认值,而且参数类型是枚举型,所以设置参数也是枚举型,只能从固定枚举中取值
class Demo{
};

 

retention和retentionpolicy

技术分享

retentionpolicy三个取值范围,

技术分享

在三个范围中,最重要的是RUNTIME,因为执行时候起作用。

使用retention制定一个annotation的范围,范围为RUNTIME范围。

import java.lang.annotation.Retention ;
import java.lang.annotation.RetentionPolicy ;
@Retention(value=RetentionPolicy.RUNTIME)    // 表示此Annotation在运行时有效
public @interface MyDefaultRententionAnnotation{
    public String name() default "李兴华" ;
}

此annotation可以在运行时候起作用,而且在以后讲解反射与annotation操作中,也必须使用此种范围。

技术分享

 

 

总结

1,annotation的定义格式,以及变量类型:枚举,数组,普通变量。

2,retention,retentionPolicy的作用。

自定义annotation