自定义annotation

自定义annotation格式:

定义简单annotation:

public @interface MyDefaultAnnotationArrayParam{
}

使用简单annotation:

@MyDefaultAnnotationArrayParam
class Demo{
};

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

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

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

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

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

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

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

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

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

例如对于这个annotation

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

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

@MyDefaultAnnotationMoreParam(key="MLDN",value="李兴华")
class Demo{
};

也可以设置一个数组进去

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

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

@MyDefaultAnnotationArrayParam(value={"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的作用。

时间: 2024-10-18 08:22:38

自定义annotation的相关文章

java自定义Annotation,得到注解类中Annotation设定的注解值

java注解机制在各大框架中应用普遍,注解中可以设置一些值,如何得到呢. 要得到注解类中Annotation设定的注解值 即:遍历自定义Annotation中的方法,反射执行方法,结果就是 对应的注解值. java代码例子: package com.doctor.spring.core; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotat

想必大家在做参数验证的时候,都会遇到一个问题,就是如何验证枚举? 自定义annotation 自定义Validator

想必大家在SpringMVC项目做请求参数验证的时候,都会遇到一个问题,就是如何验证枚举?方法无外乎以下几种: 方法1:直接用枚举定义字段类型 方法2:用Integer类型定义字段类型,然后在代码里面验证(即:放弃使用javax.validation.validator去统一验证) 缺点: 方法1的缺点:当枚举的value值不是从0开始有序设置时,就会出现问题,因为虽然spring支持枚举类型字段的解析,但其实它是根据枚举的index,也就是索引来解析的.并且直接在请求字段上使用枚举,这个不太规

android反射组件 (一)java 自定义annotation基础知识

自定义annotation包括三部分: 自定义annotation.使用annotation的类.annotation的处理方法. 一.自定义annotation  元注解包括以下: 1)@Target    描述注解使用的范围 取值包括: 1.CONSTRUCTOR:用于描述构造器 2.FIELD:用于描述域 3.LOCAL_VARIABLE:用于描述局部变量 4.METHOD:用于描述方法 5.PACKAGE:用于描述包 6.PARAMETER:用于描述参数 7.TYPE:用于描述类.接口(

java自定义Annotation(载自百度文库)

java中自定义annotation需要@interface关键字和用到几个内置annotation. 用到的注解有@Target,@Retention,@Documented,@Inherited ,用途如下:      @Target 表示该注解用于什么地方,可能的 ElemenetType 参数包括: ElemenetType.CONSTRUCTOR 构造器声明           ElemenetType.FIELD 域声明(包括 enum 实例) ElemenetType.LOCAL_

Spring aop +自定义annotation

Spring aop +自定义注解 一.所需的jar 包: <!-- 导入java ee jar 包 --> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>7.0</version> </dependency> <!--spring ,springmvc--> <

使用自定义annotation接口进行aspectj动态缓存

由于系统需求需 要对各个接口进行key-value缓存(以参数为key,返回的对象为value), 当然对于这种情况首先考虑到的是使用aop,前段时间看过 aspectj的一些介绍, 借此机会正好加以应用和体会一下,aspectj是AOP最早成熟的java实现, 它稍微扩展了一下java语言,增加了一些 keyword等,具体的aspectj的基本语法见这里,进行缓存的框架使用较成熟的ehcache.下面开始进行配置首先是ehcache的配置文件 <?xml version="1.0&qu

Java中的Annotation (二、自定义Annotation)

今天学习如何开发一个自定义的Annotation.要想使Annotation有意义,还需要借用前几天学习的反射机制. 下面就开始今天的学习吧. Annotation的定义格式.它类似于新创建一个接口类文件,但为了区分,我们需要将它声明为 @interface public @interface Annotation名称{ 数据类型 变量名称(); } 下面声明了一个Annotation public @interface MyAnnotation { } 使用这个Annotation @MyAn

Java自定义Annotation

创建一个自定义的Annotation import java.lang.annotation.*; import java.lang.reflect.Method; @Documented @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface MethodInfo { String author() default "hupeng"; String version() defa

Java自定义Annotation,通过反射解析Annotation

创建一个自定义的Annotation import java.lang.annotation.*; import java.lang.reflect.Method; @Documented @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface MethodInfo { String author() default "hupeng"; String version() defa