自定义注解

本文记录Java学习过程中遇到的自定义注解~

基本语法

定义注解需要使用关键字@interface。

示例代码(定义注解):

@interface MyAnno{
	
}

示例代码(定义含有属性的注解):

@interface MyAnno{
	String value();
}

属性格式:

修饰符 返回值类型 属姓名() [default 默认值]
  • 修饰符:默认值为public abstract,且只能是public abstract;
  • 返回值类型:基本类型、String、Class、注解和枚举,以及以上类型的一维数组;
  • 属姓名:自定义,符合变量名的命名规范即可;
  • default:默认值,可以省略。

使用

注解的使用格式:

@注解类名(key=value, key=value, ...)

注意事项:

  • 注解可以没有属性,如果有属性需要使用小括号括住;
  • 属性格式:key=value,多个属性使用逗号分隔;
  • 如果属性名为value且只有一个属性,value可以省略;
  • 如果同时使用多个属性,属性名为value的不能省略属性名;
  • 如果属性类型为数组,设置内容格式为:{1, 2, 3};
  • 如果属性类型为数组,值只有一个,{}可以省略;
  • 一个对象上,注解只能使用一个,不能重复使用。

解析

如果给类或方法等添加注解,需要获得注解上设置的数据的时候就必须对注解进行解析,JDK提供java.lang.reflect.AnnotatedElement接口允许在运行时通过反射获得注解。

AnnotatedElement接口常用方法:

  • boolean isAnnotationPresent(Class clazz):获取当前对象是否有注解;
  • T getAnnotation(Class<T> annotationClass):获取当前对象上执行的注解;
  • Annotation[] getAnnotations():获取当前对象及从父类上继承的所有注解;
  • Annotation[] getDeclaredAnnotations():获取当前对象上所有的注解。

元注解

元注解时用来修饰注解的注解。

JDK提供4种元注解:

@Retention:用于确定被修饰的自定义注解的生命周期:

  • RetentionPolicy.SOURCE:被修饰的注解只能存在源码中,字节码.class中没有,提供给编译器使用;
  • RetentionPolicy.CLASS:被修饰的注解只能存在源码和字节码中,运行时内存中没有,提供给JVM虚拟机使用;
  • RetentionPolicy.RUNTIME:被修饰的注解存在于源码、字节码和内存中,用于取代XML配置。

@Target:用于确定被修饰的自定义注解:

  • ElementType.TYPE:修饰类和接口;
  • ElementType.CONSTRUCTOR:修饰构造函数;
  • ElementType.METHOD:修饰方法;
  • ElementType.FIELD:修饰方法。

@Documented:使用JavaDoc生成API文档时是否包含此注解;

@Inherited:父类使用被修饰的注解子类是否继承。

标签: none