一.系统内置标准注解html
1.@Override 是一个标记注解类型,它被用做标注方法。java
它说明了被标注的方法重载了父类的方法,起到了断言的做用。若是咱们使用了这种Annotation在一个没有覆盖父类方法的方法时,java编译器将以一个编译错误来警示。这个annotaton经常在咱们试图覆盖父类方法而确又写错了方法名时发挥威力。使用方法极其简单:在使用此annotation时只要在被修饰的方法前面加上@Override便可。编程
2.@Deprecated,标记已过期:安全
同 样Deprecated也是一个标记注解。当一个类型或者类型成员使用@Deprecated修饰的话,编译器将不鼓励使用这个被标注的程序元素。并且这种修饰具备必定的 “延续性”:若是咱们在代码中经过继承或者覆盖的方式使用了这个过期的类型或者成员,虽然继承或者覆盖后的类型或者成员并非被声明为 @Deprecated,但编译器仍然要报警。ide
值得注意,@Deprecated这个annotation类型和javadoc中的 @deprecated这个tag是有区别的:前者是java编译器识别的,然后者是被javadoc工具所识别用来生成文档(包含程序成员为何已通过 时、它应当如何被禁止或者替代的描述)。函数式编程
在java5.0,java编译器仍然象其从前版本那样寻找@deprecated这个javadoc tag,并使用它们产生警告信息。可是这种情况将在后续版本中改变,咱们应在如今就开始使用@Deprecated来修饰过期的方法而不是 @deprecated javadoc tag。函数
3.SuppressWarnnings,抑制编译器警告:工具
@SuppressWarnings 被用于有选择的关闭编译器对类、方法、成员变量、变量初始化的警告。在java5.0,sun提供的javac编译器为咱们提供了-Xlint选项来使编译器对合法的程序代码提出警告,此种警告从某种程度上表明了程序错误。例如当咱们使用一个generic collection类而又没有提供它的类型时,编译器将提示出"unchecked warning"的警告。一般当这种状况发生时,咱们就须要查找引发警告的代码。若是它真的表示错误,咱们就须要纠正它。例如若是警告信息代表咱们代码中的switch语句没有覆盖全部可能的case,那么咱们就应增长一个默认的case来避免这种警告。
有时咱们没法避免这种警告,例如,咱们使用必须和非generic的旧代码交互的generic collection类时,咱们不能避免这个unchecked warning。此时@SuppressWarning就要派上用场了,在调用的方法前增长@SuppressWarnings修饰,告诉编译器中止对此方法的警告。
SuppressWarning不是一个标记注解。它有一个类型为String[]的成员,这个成员的值为被禁止的警告名。对于javac编译器来说,被-Xlint选项有效的警告 名也一样对@SuppressWarings有效,同时编译器忽略掉没法识别的警告名。 @SuppressWarnings(value={ "rawtypes", "unchecked" })学习
@SuppressWarnings({ "rawtypes", "unchecked" })spa
@SuppressWarnings("unused")
抑制警告的关键字
参数安全类型注解。它的目的是提醒开发者不要用参数作一些不安全的操做,它的存在会阻止编译器产生 unchecked 这样的警告。它是在 Java 1.7 的版本中加入的。
@SafeVarargs // Not actually safe! public 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! }
上面的代码中,编译阶段不会报错,可是运行时会抛出 ClassCastException 这个异常,因此它虽然告诉开发者要妥善处理,可是开发者本身仍是搞砸了。
Java 官方文档说,将来的版本会受权编译器对这种不安全的操做产生错误警告
5.@FunctionalInterface
函数式接口注解,这个是 Java 1.8 版本引入的新特性。函数式编程很火,因此 Java 8 也及时添加了这个特性。
函数式接口 (Functional Interface) 就是一个具备一个方法的普通接口。
好比
@FunctionalInterface public interface Runnable { /** * When an object implementing interface <code>Runnable</code> is used * to create a thread, starting the thread causes the object's * <code>run</code> method to be called in that separately executing * thread. * <p> * The general contract of the method <code>run</code> is that it may * take any action whatsoever. *
* @see java.lang.Thread#run() */ public abstract void run() }
咱们进行线程开发中经常使用的 Runnable 就是一个典型的函数式接口,上面源码能够看到它就被 @FunctionalInterface 注解。
可能有人会疑惑,函数式接口标记有什么用,这个缘由是函数式接口能够很容易转换为 Lambda 表达式。这是另外的主题了,有兴趣的同窗请本身搜索相关知识点学习。
二.自定义注解
三.注解的提取
参考资料 http://www.cnblogs.com/peida/archive/2013/04/26/3038503.html
http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html