一、注解概述
- 从 JDK 5.0 开始,Java 增加了对元数据(MetaData) 的支持,也就是Annotation(注解)
- Annotation 其实就是代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理。通过使用 Annotation,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者进行部署。
- Annotation 可以像修饰符一样被使用,可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明,这些信息被保存在 Annotation 的 “name=value” 对中
- 在JavaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在JavaEE/Android中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替JavaEE旧版中所遗留的繁冗代码和XML配置等。
- 开发模式都是基于注解的,注解是一种趋势,一定程度上可以说:框架 = 注解 + 反射 + 设计模式。
另外,Junit单元测试中也有大量注解的使用。简单罗列到下面:
- @Test:标记在非静态的测试方法上,只有标记@Test的方法才能被作为一个测试方法单独测试,一个类中可以有多个@Test标记的方法。运行时如果只想运行其中一个@Test标记的方法,那么选择这个方法名,然后单独运行, 否则整个类的所有标记了@Test的方法都会被执行。
- @Test(timeout=1000):设置超时时间,如果测试时间超过了你定义的timeout,测试失败
- @Test(expected):申明会发生的异常,比如@Test(expected=Exception.class)
了解:
- @BeforeClass:标记在静态方法上,因为这个方法只执行一次。在类初始化时执行。
- @AfterClass:标记在静态方法上,因为这个方法只执行一次。在所有方法完成后执行。
- @Before:标记在非静态方法上。在@Test方法前面执行,而且是在每一个@Test方法前面都执行。
- @After:标记在非静态方法上。在@Test方法后面执行,而且是在每一个@Test方法后面都执行。
- @Ignore:标记在本次不参与测试的方法上,这个注解的含义就是“某些方法尚未完成,暂不参与此次测试”。
- @BeforeClass、@AfterClass、@Before、@After、@Ignore都是配合@Test它使用的,单独使用没有意义。
二、常见的注解
使用 Annotation 时要在其前面增加 @ 符号, 并把该 Annotation 当成一个修饰符使用。用于修饰它支持的程序元素
(一)JDK内置的三个基本注解
在编译时进行格式检查
1.@Override
限定重写父类方法, 该注解只能用于方法
2.@Deprecated
用于表示所修饰的元素(类, 方法等)已过时。通常是因为所修饰的结构危险或存在更好的选择
3.@SuppressWarnings
作用:告诉编译器忽略指定的警告,不用在编译完成后出现警告信息。(抑制编译器警告)
使用:
@SuppressWarnings("")
。
@SuppressWarnings({})
。
@SuppressWarnings(value={})
。
@SuppressWarnings(value={"具体的警告","具体的警告"...})
。
我们可以看到SuppressWarnings注解中有一个value(),它是成员变量,以无参数方法的形式来声明。其方法名和返回值定义了该成员的名字和类型。
示例:
-
@SuppressWarnings("all")
抑制所有警告信息 -
@SuppressWarnings(“unchecked”)
告诉编译器忽略 unchecked 警告信息,如使用List,ArrayList等未进行参数化产生的
警告信息。 -
@SuppressWarnings(“deprecation”)
如果使用了使用@Deprecated注释的方法,编译器将出现警告信息。使用这个注释将警告信息去掉。 -
@SuppressWarnings(“unchecked”, “deprecation”)
告诉编译器同时忽略unchecked和deprecation的警告信息。 -
@SuppressWarnings(value={“unchecked”, “deprecation”})
等同于@SuppressWarnings(“unchecked”, “deprecation”)
案例演示
public class AnnotationTest{
public static void main(String[] args) {
@SuppressWarnings("unused")//告诉编译期,忽略“unused”警告信息
int a = 10;//未使用的变量
}
@Deprecated
public void print(){
System.out.println("过时的方法");
}
@Override
public String toString() {
return "重写的toString方法()"; }
}
三、自定义注解
- 定义新的 Annotation 类型要使用 @interface 关键字
- 自定义注解自动继承了
java.lang.annotation.Annotation
接口 - Annotation 的成员变量在 Annotation 定义中以无参数方法的形式来声明。其方法名和返回值定义了该成员的名字和类型。我们称为配置参数。类型只能是八种基本数据类型、String类型、Class类型、enum类型、Annotation类型、以上所有类型的数组。
- 可以在定义 Annotation 的成员变量时为其指定初始值,指定成员变量的初始值可使用 default 关键字
- 如果只有一个参数成员,建议使用参数名为value
- 如果定义的注解含有配置参数,那么使用时必须指定参数值,除非它有默认值。格式是“参数名 = 参数值”,如果只有一个参数成员,且名称为value,可以省略“value=”
- 没有成员定义的 Annotation 称为标记;包含成员变量的 Annotation 称为元数据 Annotation
注意:自定义注解必须配上注解的信息处理流程(使用到反射)才有意义。
案例演示
自定义注解
public @interface MyAnnotation {
String[] value() default "hi";
}
测试类
pu