Java中Annotation(注释)系列学习笔记(1)

来源:互联网 发布:骨甲文软件开发公司 编辑:程序博客网 时间:2024/06/13 02:58
关于Annotation注释,一年以前,阿堂简单学习了一下,没有在项目中去用它。。最近在学习国内的高级J2EE架构师黎活明老师的《EJB3入门精典》一书时,一上手便发现有很多的Annotation的应用,所以想把Annotation好好学习一下,如是就有了阿堂下面的这几遍学习笔记的产生了.顺便说一下,EJB3是属于JAVA中重量级框架,对于分布式的处理,它有非常明显的优势,这一点是和Spring等轻量级框架是有所区别的,可以说是两者的侧重点不同吧。EJB3开发的项目,在银行,金融,保险等大型企业中有着极为广泛的应用。EJB3的产生,完全颠覆了原来EJB2中的一些繁琐的处理方式,不能不说是一次技术的伟大革新!
  好,下面咱们言归正传,开始学习了!
  从JDK1.5开始,Java中增加了对元数据(MetaData)的支持,也就是Annotation(注释),这种Annotation与Java程序中的单行注释和文本注释是有一定区别,也有一定联系的。其实,我们现在说的Annotation是代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过Annotation,程序开发人员可以在不改变原来逻辑的情况下,在源文件嵌入一些补充的信息。代码分析工具,开发工具和部署工具可通过这些补充信息进行验正或者部署。
  Annotation提供了一条为程序元素设置元素的方法,从某些方面来看,Annotation就象修饰符一样被使用,可用于修饰包,类,构造器,方法,成员变量,参数,局部变量的声明,这些信息被存在Annotation的"name=value"对中。
注意
    Annotation是的一个接口,程序可以通过反射来获取指定程序元素的Annotation对象,然后通过Annotation对象来取得注释里的元数据。我们需要注意使用Annotation的地方,有的Annotation指的是java.lang.Annotation接口,有的指的是注释本身.
  
  Annotation能被用来为程序元素(类,方法,成员变量)设置元数据。值得指出的是:Annotation不能影响程序代码的执行,无论增加,删除Annotation,代码都始终如一地执行。如果希望让程序中的Annotation能在运行时起一定的作用,只有通过某种配套的工具对Annotation中的信息进行访问和处理,访问和处理Annotation的工具统称为APT(Annotation Processing Tool).

一.基本Annotation
  Annotation必须使用工具来处理,工具负责读取Annotation里包含的元数据,工具还会根据这些元数据增加额外的功能。在系统学习新的Annotation语法之前,先看一下Java提供的三个基本Annotation的用法:使用Annotation时要在其前面增加@符号,并把该Annotation当成一个修饰符使用,用于修饰它支持的程序元素.

三个基础的Annotation如下
@Override
@Deprecated
@SuppressWarings

(这三个基本的Annotation都定义在java.lang包下)
下面我们来依次这三个Annotation的用法

(1)限定重写父类方法 @Override
  @Override就是用来指定方法覆盖的,它可以强制一个子类必须覆盖父类的方法。如下程序中使用@Override指定子类Apple的info方法必须重写父类方法
注意: @Override Annotation只能用于作用于方法,不能用于作用于其它程序元素
程序清单

public class  Fruit
{
 public void info()
 {
  System.out.println("水果的info方法...");
 }
}


class Apple extends Fruit
{
 @Override
 public void info()
 {
  System.out.println("苹果重写水果的info方法...");
 }
}

  编译上面程序,可能丝毫看不出程序中@Override有任何作用。因为@Override Annotation的作用是告诉编译器检查这个方法,并从父类查找是否包含一个被该方法重写的方法,否则就编译出错。这个Annotation主要是帮助我们避免一些低级错务,例如我们把上面的Apple类中的info方法不小心写成inf0()方法,这样的“低级错务”,可能导致后期排错时的巨大障碍。

例如,我们把Apple中的info方法误写成inf0(),编译程序时将出现如下错务提示:

Java中Annotation(注释)系列学习笔记(1) - zhang8mss - zhang8mss的博客

(2)标记已过时 @Deprecated
@Deprecated 用于表示某个程序元素(类,方法等)已过时,当其它程序使用已过进的类,方法时,编译器将会出现警告。如下程序指定Apple类中的info方法已过时,其它程序中使用Apple类的info方法时编译器将会出给出警告。

如下程序所示

 


class Apple
{
 //定义info方法已过时
 @Deprecated
 public void info()
 {
  System.out.println("Apple的info方法");
 }
}
public class DeprecatedTest
{
 public static void main(String[] args)
 {
  //下面使用info方法时将会被编译器警告
  new Apple().info();
 } 
}


运行效果图如下

Java中Annotation(注释)系列学习笔记(1) - zhang8mss - zhang8mss的博客

(3)@SuppressWarnings 抑制编译器警告
  @SupressWarnings指示被Annotation标识的程序元素(以及在程序元素中的所有子元素)取消显示指定的编译器警告。 @SuppressWarnings会一直作用于该程序元素的所有子元素,例如使用@SuppressWarning标识一个类来取消某个编译器警告,同时又标识该类里某个方法取消另一个编译器警告,那么将在此方法中同时取消这两个编译器警告。

  通常情况下,如果程序中使用没有泛型限制的集合将会引起编译器警告,为了避免这种编译器警告,可以使用@SuppressWarnings Annotation,下面程序取消了没有使用泛型的编译器警告。

程序如下所示
@SuppressWarnings(value="unchecked")
public class SuppressWarningsTest
{
 public static void main(String[] args)
 {
  List<String> myList = new ArrayList();  
 } 
}

 

说明:
  程序中使用@SuppressWarnings来关闭SuppressWarningTest类里的所有编译器警告,编译上面程序时将不会看到任保编译器警告。

Java中Annotation(注释)系列学习笔记(1) - zhang8mss - zhang8mss的博客

如果删除程序中粗体字代码,将会看下面图2中的警告提示

Java中Annotation(注释)系列学习笔记(1) - zhang8mss - zhang8mss的博客

说明:
  当我们使用@SuppressWarnings Annotation来关闭编译器警告时,一定要在插号里使用name=value对来为该Annotation的成员变量设置值.

原创粉丝点击