Java 注解(Annotation) 一、注解(Annotation)

  1、概述

    (1)从 JDK 5.0 开始, Java 增加了对元数据(MetaData) 的支持, 也就是Annotation(注解);

    (2)Annotation 其实就是代码里的特殊标记, 这些标记可以在编译, 类加载, 运行时被读取, 并执行相应的处理。通过使用 Annotation, 程序员可以在不改变原有逻辑的情况下, 在源文件中嵌入一些补充信息。 代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证
或者进行部署。

    (3)Annotation 可以像修饰符一样被使用, 可用于修饰包,类, 构造器, 方法, 成员变量, 参数, 局部变量的声明, 这些信息被保存在 Annotation的 “name=value” 对中。

    (4)在JavaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在JavaEE/Android中注解占据了更重要的角色,例如用来配置应用程序的任何切面, 代替JavaEE旧版中所遗留的繁冗代码和XML配置等。

    (5)未来的开发模式都是基于注解的, JPA是基于注解的, Spring2.5以上都是基于注解的, Hibernate3.x以后也是基于注解的,现在的Struts2有一部分也是基于注解的了,注解是一种趋势,一定程度上可以说: 框架 = 注解 + 反射 + 设计模式。

    (6)注解(Annotation),也叫元数据。一种代码级别的说明。它是 JDK1.5 及以后版本引入的一个特效,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等前面,用来对这些元素进行说明,注释。

 

  2、注解作用

     代码分析:通过代码里标识的注解对代码进行分析【使用反射】

     编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查【Override】

  3、

  4、

  5、

二、常见的 Annotation 示例

  1、注解的使用

    使用 Annotation 时要在其前面增加 @ 符号, 并把该 Annotation 当成一个修饰符使用。 用于修饰它支持的程序元素。

  2、示例一:生成文档相关的注解

    说明:

@author 标明开发该类模块的作者, 多个作者之间使用,分割
@version 标明该类模块的版本
@see 参考转向, 也就是相关主题
@since 从哪个版本开始增加的
@param 对方法中某参数的说明, 如果没有参数就不能写
@return 对方法返回值的说明, 如果方法的返回值类型是void就不能写
@exception 对方法可能抛出的异常进行说明 , 如果方法没有用throws显式抛出的异常就不能写

      其中:

      @param @return 和 @exception 这三个标记都是只用于方法的。
      @param的格式要求: @param 形参名 形参类型 形参说明
      @return 的格式要求: @return 返回值类型 返回值说明
      @exception的格式要求: @exception 异常类型 异常说明
      @param和@exception可以并列多个

    Demo:

 1 package com.njf.javadoc; 2  3 /** 4  * @author niujifei 5  * @version 1.0 6  * @see Math.java 7  */ 8 public class JavadocTest { 9     /**10      * 程序的主方法,程序的入口11      * @param args String[] 命令行参数12      */13     public static void main(String[] args) {14     }15     /**16      * 求圆面积的方法17      * @param radius double 半径值18      * @return double 圆的面积19      */20     public static double getArea(double radius){21         return Math.PI * radius * radius;22     }23 }

 

可以使用 javadoc  文件名.java  来生成 doc 文档(通过代码里标识的注解生成文档)

  

  3、示例二:在编译时进行格式检查(JDK内置的三个基本注解)

    说明:

@Override: 限定重写父类方法, 该注解只能用于方法,检测被该注解标注的方法是否是继承自父类(接口)的,它只能用在方法上面,会让编译器对这个方法进行格式检查,是否满足重写的要求。
@Deprecated: 用于表示所修饰的元素(类, 方法等)已过时。通常是因为所修饰的结构危险或存在更好的选择
@SuppressWarnings: 抑制编译器警告,一般传递参数 all,压制所有的警告(@SuppressWarnings("all"))

    Demo:

 1 public class AnnotationTest{ 2     public static void main(String[] args) { 3         @SuppressWarnings("unused")  //表示压制警告,可以作用与类与方法或变量 4         int a = 10; 5     } 6     @Deprecated    //表示犯法已经过时了,但是不能删除,为了向下兼容 7     public void print(){ 8         System.out.println("过时的方法"); 9     }10     @Override11     public String toString() {12         return "重写的toString方法()";13     }14 }

 

  4、示例三:跟踪代码依赖行,实现替代配置文件功能

    说明:Servlet3.0提供了注解(annotation),使得不再需要在web.xml文件中进行Servlet的部署。

    Demo:

 1 @WebServlet("/login") 2 public class LoginServlet extends HttpServlet { 3     private static final long serialVersionUID = 1L; 4  5     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws 6             ServletException, IOException { 7     } 8  9     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws10             ServletException, IOException {11         doGet(request, response);12     }13 }
1 <servlet>2     <servlet-name>LoginServlet</servlet-name>3     <servlet-class>com.servlet.LoginServlet</servlet-class>4 </servlet>5 <servlet-mapping>6     <servlet-name>LoginServlet</servlet-name>7     <url-pattern>/login</url-pattern>8 </servlet-mapping>

 

   Spring 框架中关于“事务”的管理:

 1     @Transactional(propagation = Propagation.REQUIRES_NEW, 2             isolation = Isolation.READ_COMMITTED, readOnly = false, timeout = 3) 3     public void buyBook(String username, String isbn) { 4         //1.查询书的单价
 5         int price = bookShopDao.findBookPriceByIsbn(isbn); 6         //2. 更新库存
 7         bookShopDao.updateBookStock(isbn); 8         //3. 更新用户的余额
 9         bookShopDao.updateUserAccount(username, price);10     }

 

1 <!-- 配置事务属性 -->2 <tx:advice transaction-manager="dataSourceTransactionManager" id="txAdvice">3     <tx:attributes>4         <!-- 配置每个方法使用的事务属性 -->5         <tx:method name="buyBook" propagation="REQUIRES_NEW" isolation="READ_COMMITTED" read-only="false" timeout="3"/>6     </tx:attributes>7 </tx:advice>

 

  5、Junit 相关的注解

    (1)@Test :表示它是一个单元测试方法

       这个方法需要是: 

public void xxx() {}

    (2)@Before:表示在每一个单元测试方法之前执行

       这个方法需要是:

public void xxx() {}

   (3)@After:表示在每一个单元测试方法之后执行

       这个方法需要是:

public void xxx() {}

   (4)@BeforeClass:表示在类初始化阶段执行,而且只执行一次

      这个方法需要是:

public static void xxx() {}

    (5)@AfterClass:表示在类的“卸载”阶段执行,而且只执行一次

         这个方法需要是:

public static void xxx(){}

  

  6、

三、JDK 中的元注解 四、自定义注解 五、 六、