什么是注解
An annotation is a form of metadata, that can be added to Java source code. Classes, methods, variables, parameters and packages may be annotated. Annotations have no direct effect on the operation of the code they annotate.
注解是一种元数据, 可以添加到java代码中类、方法、变量、参数、包都可以被注解,注解对注解的代码没有直接影响。之所以产生作用, 是对其解析后做了相应的处理。注解仅仅只是个标记罢了。
定义注解关键字:@interface
元注解
java内置的注解有Override, Deprecated, SuppressWarnings等, 作用相信大家都知道。
现在查看Override注解的源码
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
发现Override注解上面有两个注解, 这就是元注解。 元注解就是用来定义注解的注解.其作用就是定义注解的作用范围, 使用在什么元素上等等。
元注解共有四种@Retention, @Target, @Inherited, @Documented
@Retention 保留的范围,默认值为CLASS.可选值有三种
-
SOURCE, 只在源码中可用 -
CLASS, 在源码和字节码中可用 -
RUNTIME, 在源码、字节码、运行时`均可用。
其中, @Retention是定义保留策略, 直接决定了我们用何种方式解析, SOUCE级别的注解是用来标记的, 比如Override, SuppressWarnings. 我们真正使用的类型是CLASS(编译时)和RUNTIME(运行时)。
@Target 用来修饰哪些程序元素,
如 TYPE, METHOD, CONSTRUCTOR, FIELD, PARAMETER等,未标注则表示可修饰所有。
@Inherited 是否可以被继承,默认为false
@Documented 是否会保存到 Javadoc文档中
自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface TestAnnotation {
String value();
String[] value2() default "value2";
}
类型 参数名() default 默认值;
其中默认值是可选的, 可以定义, 也可以不定义.
处理运行时注解
Retention的值为RUNTIME时, 注解会保留到运行时, 因此使用反射来解析注解。
使用的注解就是上一步的@TestAnnotation。
先了解一下反射:









网友评论