Java注解

来源:互联网 发布:简述算法的复杂度分析 编辑:程序博客网 时间:2024/05/01 00:48
---


JDK1.5开始引入注解(`anonation`),使得我们可以在代码中添加描述和存储有关程序的额外信息(元数据),可以通过编译器在编译器对格式进行检查和验证。


## 1. 内置注解
JDK1.5预定义了三种注解,定义在`java.lang`包内。


 - @Override 表示当前方法声明将覆盖超类中方法.
 ```
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.SOURCE)
    public @interface Override {
    }
 ```
 
 - @Deprecated 表明某个元素(方法、域声明或包等)已经废弃,不被推荐使用。一旦程序员使用了注解为@Deprecated的元素,编译器会发出警告信息。
 ```
    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
    public @interface Deprecated {
    }
 ```
 - @SuppressWarnings 关闭没有必要的编译器警告信息。
 
```
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    String[] value();
}
```
 
 ## 2. 元注解
 
 Java中目前除了上面提到的3种内置注解,还提供了几种元注解。元注解专门用来负责注解其他注解,看着有点绕,简单点说,就是可以通过元注解**自定义**用户需要的注解。元注解定义在`java.lang.annotation`包内。
 
- @Target 用于表示注解用于什么地方,通过`enum`类型的ElementType参数进行指定。


```
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    // 可以应用注解的类型集合
    ElementType[] value();
}
```
ElementType指定了Java中可以标注注解的地方,包括以下几类:


```
TYPE 类、接口或`enum`声明
FIELD 域声明
METHOD 方法声明
PARAMETER 参数声明
PACKAGE 包声明
CONSTRUCTOR 构造函数声明
LOCAL_VARIABLE  局部变量声明
ANNOTATION_TYPE  注解类型声明
TYPE_PARAMETER 类型参数声明 JDK1.8引入
TYPE_USE 类型使用声明 JDK1.8引入
```
- @Retention  表示注解信息需要保存在什么级别,`RetentionPolicy`支持三种级别,默认取值是`CLASS`。
```
SOURCE  注解会被编译器丢弃
CLASS   注解编译器编译时会保留,但JVM加载时会丢弃
RUNTIME 注解在JVM运行期也会保留,并且可以通过反射机制读取注解信息
```
- @Documented 表明注解会被javadoc或类似工具使用,用于生成文档信息
- @Inherited 表明允许子类从父类中继承注解
- @Native 表明一个`field`域可能来自于`nativecode`中,JDK1.8引入
- @Repeatable


-----


## 3. 注解元素
注解的定义有点类似`interface`,但是多了`@`符号。示例如下:
```
@Tartget(ElementType.Method)
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationExample {
    // public String value() default "";
}
```
和类定义类似,可以在注解中包含一些元素,即`注解元素`。没有任何注解元素的注解被称为`标记注解`(marker annotation)。如例子所示,可以通过关键字`default`对`注解元素`指定默认值。`注解元素`可用的类型包括:


```
 1. 所有基本类型(int, float等)
 2. String
 3. Class
 4. enum
 5. Annotation
 6. 上述类型的数组
```
如果声明其他类型的`注解元素`,编译器将会报错。
编译器对`注解元素`取值要求很严格,不允许有不确定的值,要么使用默认值,要么在使用注解时给元素赋值。
0 0
原创粉丝点击