java内建注解及源码浅析
首先,先看java.lang下的4个annoation类型。如图所示:
1.Override
1.1 源码
表明在类中需要覆盖重写超类中声明的方法。如果这个方法注解了该annotation类型,但是没有重写超类的方法,编译将器会报错。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
由上面源码可知。注解类型为METHOD,即只能在方法上注解。保留策略为SOURCE,即只保留在源文件中,在编译期间就会被丢弃。
1.2 实例
public class InnerAnnotationTest {
public static void main(String[] args) {
InnerAnnotationTest innerAnnotationTest = new InnerAnnotationTest();
System.out.println(innerAnnotationTest.toString());
}
@Override
public String toString() {
//重写了toString方法
return "new String";
}
}
2.SuppressWarnings
2.1 源码
表明取消编译器对被注解元素的警告(包含在该注解元素的所有程序元素)。如果你注解了一个类来取消某个方法的警告,同时你注解了该方法来取消另一个警告,两个警告都会被取消。
根据风格不同,程序员应该始终在最里层的嵌套元素上使用此注释,在那里使用才有效。如果要在特定的方法中取消显示某个警告,则应该注释该方法而不是注释它的类。
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
String[] value();
}
由上面源码可知。注解类型是除PACKAGE,ANNOTATION_TYPE以外的元素。保留策略为SOURCE,即只保留在源文件中,在编译期间就会被丢弃。
2.2 实例
import java.io.Serializable;
@SuppressWarnings("serial")
public class InnerAnnotationTest implements Serializable{
}
上面的例子只展示一个示例。即实现了Serializable接口但并没有serialVersionUID字段。
相应的还有很多。
3.Deprecated
3.1 源码
程序元素被Deprecated注解意味着程序员并不鼓励使用该元素,例如可能会存在危险,或者是已经存在更好的选择。编译器会发出警告,当不赞成的程序元素被使用或者在不赞成的代码重写的时候。
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Deprecated {
}
由上面源码可知。保留策略为RUNTIME,在编译期间会被保留在class文件中,以及VM运行中。
3.2 实例
public class InnerAnnotationTest {
public static void main(String[] args) {
InnerAnnotationTest innerAnnotationTest = new InnerAnnotationTest();
innerAnnotationTest.deprecatedTest();
}
@Deprecated
public void deprecatedTest(){
System.out.println("不赞成的方法");
}
}
4.SafeVarargs
以上三种注解为jdk1.5的时候就存在的,而这第四个SafeVarargs为jdk1.7是出现。
4.1 源码
程序员声明被注解的方法或构造函数的变长参数不会执行不安全操作。取消出现的非具体参数警告和未检查的参数化array警告
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD})
public @interface SafeVarargs {}
由上面源码可知。注解类型是CONSTRUCTOR,METHOD即构造函数和方法。保留策略为RUNTIME,在编译期间会被保留在class文件中,以及VM运行中。
4.2 实例
//此方法为API中的示例方法
@SafeVarargs // Not actually safe!
static void m(List<String>... stringLists) {
Object[] array = stringLists;
List<Integer> tmpList = Arrays.asList(42);
array[0] = tmpList; // Semantically invalid, but compiles without warnings
String s = stringLists[0].get(0); // Oh no, ClassCastException at runtime!
}
5.参考:
http://tool.oschina.net/apidocs
https://docs.oracle.com/javase/7/docs/api/
http://www.importnew.com/17413.html
http://www.cnblogs.com/fsjohnhuang/p/4040785.html