注解,也被成为元数据,为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便的使用这些数据。—-JAVA编程思想的注解描述。
什么是注解
在JAVA中,我们最常见的有:
1 | @Override //当前类的某一个方法重写了父类的方法,当有这个注释但该方法不是父类的时候编译报错 |
我们看一下@Override的定义
1 | @Target(ElementType.METHOD) |
这样子就定义了Override这个注解。
注解就是使用一个@进行引用,他可以使用在类,方法,属性上,用于修饰。通过使用注解,我们可以做一些简化的操作,使得程序更加规范,同时也便于管理和编写。
定义注解
定义注解之前,我们需要先了解元注解。
元注解
元注解:就是用来标记自定义注解的注解,是JDK为我们提供的。比如:
1 | @Target |
其中常用的是下面的两个
- @Target 定义:他的作用是指明我们自己定义使用的对象是什么,可以看到他自己的target是ANNOTATION_TYPE,就是用来定义注解的。
1
2
3
4
5
6
7
8
9
10
11
12@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
/**
* Returns an array of the kinds of elements an annotation type
* can be applied to.
* @return an array of the kinds of elements an annotation type
* can be applied to
*/
ElementType[] value();
}
我们常用是下面的type,@Target可以同时指定多个类型,使用是1
2
3
4
5ElementType.TYPE //表明注解是使用在类,接口,enum中
ElementType.METHOD //表明注解是使用在方法中
ElementType.FIELD//表明注解属性中
ElementType.PARAMETER //表明注解是用来注解参数
ElementType.CONSTRUCTOR //表明注解是使用在构造参数中1
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
- @Retention
用来表明注解的起作用的时期,他的定义是:他的值是只能一个,不能像Target指定多个,只是RetentionPolicy 类型,有:1
2
3
4
5
6
7
8
9
10@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
/**
* Returns the retention policy.
* @return the retention policy
*/
RetentionPolicy value();
}1
2
3SOURCE // 编译时期起作用,可以通过发射破坏
CLASS//会被编译到被修饰的类的字节码中,但是仍然可以通过发射破坏,jvm不会加载这些注解信息,当我们没有为我们的注解指定Retention的时候默认值就是CLASS
RUNTIME//在运行期起作用,会被编译到被修饰的类的字节码中,无法通过反射破坏
定义
例如:
1 | @Retention(RetentionPolicy.SOURCE) |
上面定义了一个名字为CustomAnnotations的注解,他是可以用来修饰类,接口,属性的,他只是存在于编译时期,不会被编译到字节码中。例如:
1 | @CustomAnnotations |
使用
本例子来源于java编程思想:
1 | @Target(ElementType.METHOD) |
定义一个注解,他是用在方法中,以及是在运行时起作用,会被编译到字节码中。
使用:
1 | public class PasswordUtils |
可以看到,我们定义了注解之后,可以选择性的使用注解的方法,使用方式是:
1 | @Annotation(methodA=[],methodB=[]...) |
注解的方法是可选的,我们可以使用关键字default为注解的方法指定默认值,像上面那样子。
注解可以使用的数据类型有:
- java的基本类型
- String类型
- Class类型
- enum枚举类型
- Annotation类型
以及上面所有类型的数组
使用注解实现注入
使用注解实现注入的很大一个好处就是不用写很多重复的代码,同时提供一套模板给外部调用者使用,规范开发和节省开发时间。