JAVA中注解基础(Annotation)

来源:互联网 发布:淘宝天天特价在哪里 编辑:程序博客网 时间:2024/06/16 04:15

1.注解的介绍

1.1注解概念

注解:注解是那些插入到源代码中用于某种工具处理的标签。这些标签可以在源码层次上进行操作,或者可以处理编译器将它们纳入到注解类文件中。

注解不会改变对编写的程序的编译方式。JAVA编译器对于包含注释和不包含注解的代码会生成相同的虚拟机指令。
在JAVA中注解是当作一个修饰符来使用的,跟public、final等修饰符的地位一样, 他被置于被注解项之前,中间没有分号。每一个注解的名称前面都加上了@符号,这有点类似于Javadoc的注解。然而,Javadoc注解出现在/*…..*/定界符的内部,而注解是代码的一部分。

1.2注解的作用:
1、生成文档。常用的有@see @param @return 等。
2、跟踪代码依赖性,实现替代配置文件功能。比较常见的是spring 2.5 开始的基于注解配置。作用就是减少配置。
3、在编译时进行格式检查。如@override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出。
1.3注解包含的API:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.Documented;
import java.lang.annotation.Inherited;
2.注解语法

2.1一个注解是由一个注解接口来定义的:

public @interface Test{}
2.2注解里面的成员变量

注解里的成员变量声明分为两种形式:

2.2.1无默认值的形式

public @interface MyInfo{int age();String name();}
看一下,成员变量无默认值形式下如何使用注解

public class My {@MyInfo(name="Microstrong",age=20)public void info(){...}}
2.2.2有默认值的形式

也可以在定义Annotation的成员变量时,为其指定默认值,指定成员变量默认值使用default关键字。

public @interface MyInfo{int age() default 20;String name() default "Microstrong";}
如果Annotation的成员变量已经指定了默认值,使用该Annotation时可以不为这些成员变量指定值,而是直接使用默认值。

public class My {@MyInfo()public void info(){...}}
2.3根据Annotation是否包含成员变量,可以把Annotation分为如下两类:
标记Annotation:没有成员变量的Annotation被称为标记。这种Annotation仅用自身的存在与否来为我们提供信息,例如@override等。
元数据Annotation:包含成员变量的Annotation。因为它们可以接受更多的元数据,因此被称为元数据Annotation。

3.元注解

3.1@Target

@Target元注解可以应用于一个注解,以限制该注解可以应用到哪些项上。简单来说,@Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量,具体见下表。

作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)

@Target注解的元素类型@Target表示该注解可以用于什么地方,可能的ElementType参数有:
CONSTRUCTOR:构造器的声明
FIELD:域声明(包括enum实例)
LOCAL_VARIABLE:局部变量声明
METHOD:方法声明
PACKAGE:包声明
PARAMETER:参数声明
TYPE:类、接口(包括注解类型)或enum声明

例1(单个ElementType):

@Target(ElementType.METHOD)   //表示该注解可以用在什么地方(方法的声明)public @interface MyInfo{int age() default 20;String name() default "Microstrong";}
例2(多个ElementType):

@Target({ElementType.METHOD,ElementType.FIELD})   //表示该注解可以用在什么地方public @interface MyInfo{int age() default 20;String name() default "Microstrong";}
3.2@Retention

@Retention定义了该Annotation被保留的时间长短。
作用:表示需要在什么级别保存该注解信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)

@Retention表示需要在什么级别保存该注解信息。可选的RetentionPolicy参数包括:
SOURCE:Annotation只保留在源代码中,编译器编译时,直接丢弃这种Annotation。
CLASS:编译器把Annotation记录在class文件中。当运行Java程序时,JVM中不再保留该Annotation。
RUNTIME:编译器把Annotation记录在class文件中。当运行Java程序时,JVM会保留该Annotation,程序可以通过反射获取该Annotation的信息。

例1:

@Retention(RetentionPolicy.RUNTIME)public @interface MyInfo{int age() default 20;String name() default "Microstrong";}

3.3@Documented

@Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。

@Documented将注解包含在Javadoc中例1:

@Documentedpublic @interface MyInfo{int age() default 20;String name() default "Microstrong";}
3.4@Inherited

@Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。

@Inherited允许子类继承父类中的注解

例1:

import java.lang.annotation.Inherited;@Inheritedpublic @interface MyInfo{int age() default 20;String name() default "Microstrong";}

4.基本的注解

JDK默认提供了如下几个基本Annotation:

4.1@Override

限定重写父类方法。对于子类中被@Override 修饰的方法,如果存在对应的被重写的父类方法,则正确;如果不存在,则报错。@Override 只能作用于方法,不能作用于其他程序元素。

4.2@Deprecated

用于表示某个类或方法已过时。如果使用被@Deprecated修饰的类或方法时,编译器会发出警告。

4.3@SuppressWarning

抑制编译器警告。指示被@SuppressWarning修饰的程序元素取消显示指定的编译器警告。包含该程序元素中的所有子元素,例如类以及该类中的方法。例如,常见的@SuppressWarning(value="unchecked")

4.4@SafeVarargs

@SafeVarargs是JDK 7 专门为抑制“堆污染”警告提供的。





0 0
原创粉丝点击