2005年,sun公司推出了jdk1.5,同时推出的注解功能吸引了很多人的目光,使用注解编写代码,能够减轻java程序员繁琐配置的痛苦。

使用注解可以编写出更加易于维护,bug更少的代码。

注解是什么呢?按照官方的说法,注解就是元标签,可以添加到你的代码,并应用于包声明、类型声明、构造函数、方法、字段、参数和变量。

注解提供了一种非常有用的方法来显示你编写的方法是否依赖于其他方法,它们是否完整,编写出的类是否引用了其他类,等等。

按照Oracle官方的说法,基于注解编写出的java代码会根据源代码中的注解生成模板代码,从而避免我们在大多数情况下编写模板代码。这导致了一种声明式编程风格,在这种风格中,程序员说要做什么功能,工具就写出相应的代码来实现它。

简而言之,注解是一种机制,用于将元标签与程序元素相关联,并允许编译器或虚拟机从这些注解元素中提取程序行为,并在必要时生成相互依赖的代码。

现在开始我们的java注解学习之旅。

内置注解
java会内置一些已经实现好的注解,可以直接使用,内置的注解主要用于给java编译器提供指令。

java内置的注解有五个:

  • @Deprecated
  • @Override
  • @SuppressWarnings
  • @SafeVarargs
  • @FunctionalInterface

@Deprecated注解主要用于给类、方法、变量打上不建议使用的标签,如果你的代码使用了不建议使用的类、方法、变量,编译器就会给你一个警告。
下面是使用@Deprecated的示例:

public class AnnotationTest {     public static void main(String args[]){         MyAnnotation myAnnotation = new MyAnnotation();         int age = myAnnotation.age;         myAnnotation.eat();     } }  @Deprecated  class MyAnnotation {     @Deprecated     int age;          @Deprecated     void eat(){              } }

定义了一个MyAnnotation,在类名,变量名和方法名上都使用的@Deprecated注解。

使用了@Deprecated标识的类、方法或变量时,

@Deprecated还有另外一个用处,就是在javadoc文档中写明类、方法或变量为什么不建议使用,并且给出替代方法:

@Deprecated /**   @deprecated 已废弃,请使用MyNewComponent. */ class MyComponent {  }

@Override注解在方法上使用,标识这个方法重写父类的方法。如果这个方法和父类方法不一致,编译器就会显示错误。

强烈建议在重写父类的方法上使用@Override注解,不用也不会有什么影响,但是如果不使用@Override注解,当有人修改父类的方法时,你就无法识别出子类的方法是否重写了父类的方法。而使用了@Override注解,只要父类没有这个方法,编译器就会提示父类没有对应方法的错误。
下面是使用@Override注解的示例:

class Anaimal{     public void run(){              } }  class Cat extends Anaimal{     @Override     public void run(){              } }

Cat类的run()方法使用了@Override注解,如果将Cat类中的方法改为run1(),编译器就会显示The method run1() of type Cat must override or implement a supertype的错误。

如果不使用@Override注解,将Cat类中的方法改为run1(),系统则不会报错。

@SuppressWarnings注解也是在方法上使用,用于抑制警告,在调用deprecated的方法或者进行不安全的类型转化时,编译器会发出一些警告,使用@SuppressWarnings就可以忽略那些警告。
使用示例:

@SuppressWarnings public void methodWithWarning() {   }

@SafeVarargs注解主要用于抑制参数类型安全检查警告,这个是jdk1.7新增的功能。
使用示例:

@SafeVarargs static void testSafeVarargs(List<String> ... stringLists) {     Object[] array = stringLists;     List<Integer> tmpList = Arrays.asList(42);     array[0] = tmpList;      String s = stringLists[0].get(0); }

如果不使用@SafeVarargs注解,编译器会给出警告信息:Type safety: Potential heap pollution via varargs parameter stringLists
使用@SafeVarargs有个前提,你必须保证某个使用了可变长度参数的方法,在与泛型类一起使用时不会出现类型安全问题。否则在运行行