什么是注解?
JDk5开始有了Annotation,它是代码的一种特殊标记,可以在编译,类加载,运行时被读取,并执行相应的处理。通过使用注解,程序员可以在不改变代码逻辑的情况下,在源文件里写一些补充信息。
Annotation是一个接口,程序可以通过反射来获取指定元素的Annotation对象,然后得到注解内容。
注解(Annotation)相当于一种标记,在程序中加入注解就等于为程序打上某种标记,没有加,则等于没有任何标记,以后,javac编译器、开发工具和其他程序可以通过反射来了解你的类及各种元素上有无何种标记,看你的程序有什么标记,就去干相应的事,标记可以加在包、类,属性、方法,方法的参数以及局部变量上。
注解的作用:
- 配置文件:替代xml等文本文件格式的配置文件。使用注解作为配置文件可以在代码中实现动态配置,相比外部配置文件,注解的方式会减少很多文本量。但缺点也很明显,更改配置需要对代码进行重新编译,无法像外部配置文件一样进行集中管理(所以现在基本都是外部配置文件+注解混合使用)。
- 数据的标记:注解可以作为一个标记(例如:被@Override标记的方法代表被重写的方法)。
- 减少重复代码:注解可以减少重复且乏味的代码。比如我们定义一个@ValidateInt,然后通过反射来获得类中所有成员变量,只要是含有@ValidateInt注解的成员变量,我们就可以对其进行数据的规则校验。
5个基本Annotation
- 限定重写父类方法:@override
如果有@override则表示子类继承父类的方法必须重写。下面程序写了一个A类,然后Demo6继承类A,方法使用了@override,但没有对类A的方法进行重写,报错:The method inf() of type Demo6 must override or implement a supertype method
- 标记已过时:@Deprecated
有这个注解,编译器上会出现一道横线,提醒此方法过时。
- 抑制编译器警告:@SuppressWarnings
在写代码时出现警告,如何消除?
就可以使用此注解。
@SuppressWarnings("unchecked")//消除单行警告
public void addItems(String item){
@SuppressWarnings("rawtypes")
List items = new ArrayList();
items.add(item);
}
@SuppressWarnings(value={"unchecked", "rawtypes"})//一直多行警告
public void addItems(String item){
List items = new ArrayList();
items.add(item);
}
@SuppressWarnings("all")//抑制所有警告
public void addItems(String item){
List items = new ArrayList();
items.add(item);
}
- Java7的“堆污染”警告:@SafeVarargs
简单的说,数组元素的数据类型在编译和运行时都是确定的,而泛型的数据类型只有在运行时才能确定下来,因此当把一个泛型存储到数组中时,编译器在编译阶段无法检查数据类型是否匹配,因此会给出警告信息:存在可能的“堆污染”(heap pollution),即如果泛型的真实数据类型无法和参数数组的类型匹配,会导致ClassCastException异常。,因此当在可变长参数中使用泛型时,编译器都会给出警告信息。
使用@SafeVarargs便可以解决。
- Java8的函数接口与@FunctionalInterface
如果一个接口只有一个抽象对象,该接口就是函数式接口。@FunctionalInterface用阿里修饰此接口。
@FunctionalInterface
interface GreetingService
{
void sayMessage(String message);
}