1.注解的官网定义:
- 注解是一种元数据形式,即注解是属于Java的一种数据类型,和类、接口、数组、枚举类似。
- 注解用来修饰类、方法、变量、参数、包
- 注解不会对锁修饰的代码产生直接的影响
2.创建注解步骤:
第一步:定义注解--相当于定义标记;
第二步:配置注解--把标记打在需要用到的程序代码中;
第三步:解析注解--在编译期或者运行时检测到标记,并进行特殊操作。
3.具体操作:
/* 操作规范:
* key:
* 1.用户没有赋值
* 如果key为"",表示用户使用自动生成的key
* key:包名.类名.方法名.拼接第一个参数
* 2.如果用户赋值
* key:使用用户的数据
* seconds:
* 如果时间不为0,表示用户需要设定超时时间
*/
@Target({ElementType.METHOD}) //对方法生效
@Retention(RetentionPolicy.RUNTIME)
public @interface Cache_Find {
String key() default "";
int seconds() default 0;
}
注意点:
- 访问修饰符必须为public;
- 该元素的类型只能是基本数据类型,String,Class,枚举类型,注解类型以及一维数组;
- 上面代码中的key()并不是定义方法参数的地方,也不能再()中定义任何参数,它只是一种语法。
- default是该方法的默认值,必须要和方法前边定义的类型一致。
- 如果没有给默认值的话,在后期使用注解的使用,一定需要给该元素赋值。否则就会报错。
4.常用的元注解:
4.1@Target:
//@Target({ElementType.METHOD}) 上面的代码代表对方法生效
public enum ElementType {
/** Class, interface (including annotation type), or enum declaration */
/*类,接口(包括注解类型)或枚举的声明*/
TYPE,
/** Field declaration (includes enum constants) */
/*属性声明*/
FIELD,
/** Method declaration */
/*方法形式参数说明*/
METHOD,
/** Formal parameter declaration */
/*方法形式参数声明*/
PARAMETER,
/** Constructor declaration */
/*构造方法的声明*/
CONSTRUCTOR,
/** Local variable declaration */
/*局部变量声明*/
LOCAL_VARIABLE,
/** Annotation type declaration */
/*注解类型声明*/
ANNOTATION_TYPE,
/** Package declaration */
/*包的声明*/
PACKAGE,
/**
* Type parameter declaration
* 类型参数声明
* @since 1.8
*/
TYPE_PARAMETER,
/**
* Use of a type
*类型的使用
* @since 1.8
*/
TYPE_USE
}
4.2@Retention:
@Retention注解,划分为持久力、保持力。即用来修饰自定义注解的生命力。
注解的声明周期有三个阶段:1、Java源文件阶段;2、编译到Class文件阶段;3、运行期阶段。同样使用了 RetentionPolicy 枚举类型定义了三个阶段:
public enum RetentionPolicy {
/**
* Annotations are to be discarded by the compiler.
* 注解将被编译器忽略掉
*/
SOURCE,
/**
* Annotations are to be recorded in the class file by the compiler
* but need not be retained by the VM at run time. This is the default
* behavior.
* 注解将被编译器记录在Class文件中,但是在运行的时候,不会被虚拟机保留,这是一个默认的行为
*/
CLASS,
/**
* Annotations are to be recorded in the class file by the compiler and
* retained by the VM at run time, so they may be read reflectively.
* 注解将被编译器记录在class文件中,而且在运行时会被虚拟机保留,因此他们可以通过反射读取到
* @see java.lang.reflect.AnnotatedElement
*/
RUNTIME
}
4.3@Documented:
@Documented注解,是被用来指定自定义注解是否能随着被定义的java文件生成到JavaDoc文档当中。
4.4@Inherited:
@Inherited注解,是指定某个自定义注解如果写了父类的声明部分,那么子类的声明部分也能自动拥有该注解。@Inherited注解只对那些@Target被定义为ElementType.TYPE的自定义注解起作用。