java6.0新特性<四>

1.简介

在前面几个部分,已经描述了java 6.0中的部分特性,比如公共注解、java平台中的脚本语言以及JDBC4.0,本篇文章假设读者已经了解和熟悉java 5.0中的一些概念,同时,建议在读这篇文章之前,读一下前几篇文章。本篇,具体来说,主要是关于自定义注解的部分。

2.自定义注解

2.1 注解简介

java 5.0 开始就有了注解,规定定义在JSR 175下面,目标是为java变成语言提供元数据功能。它可以用在编译和运行时,用来进行代码的生产、有效性的验证以及其他有用的工作。在Java 6.0 中,又引入了一个新的JSR,那就是JSR 269,那就是可插拔式注解处理API,在这个API下面,开发者可以自定义注解处理器,用来操作代码中出现的注解。

下面,我们就看一下如何开发自定义注解以及自定义注解处理器:

2.2开发自定义注解

本节提供java文件中用到的两个自定义注解以及一个自定义注解处理器。两个自定义注解,一个是类级别的注解,一个是方法级别的注解。

自定义注解之类的注解:

packagenet.javabeat.articles.java6.newfeatures.customannotations; 
importjava.lang.annotation.*; 
@Target(value = {ElementType.TYPE})
public@interfaceClassLevelAnnotation {
}

自定义注解之方法的注解:

package net.javabeat.articles.java6.newfeatures.customannotations; 
import java.lang.annotation.*; 
@Target(value = {ElementType.METHOD})
public @interface MethodLevelAnnotation {
}

自定义注解之使用:

package net.javabeat.articles.java6.newfeatures.customannotations; @ClassLevelAnnotation()
public class AnnotatedJavaFile { 
    @MethodLevelAnnotation
    public void annotatedMethod(){
    }
}

上面的java文件使用了类注解和方法注解,注意,类注解@ClassLeverAnnotation是作用的类级别上的,@MethodLevelAnnotation是作用的方法级别上的,这是因为二者的注解类型不同。关于注解类型,有下面的几种:

  • 1.CONSTRUCTOR:用于描述构造器
  • 2.FIELD:用于描述域
  • 3.LOCAL_VARIABLE:用于描述局部变量
  • 4.METHOD:用于描述方法
  • 5.PACKAGE:用于描述包
  • 6.PARAMETER:用于描述参数
  • 7.TYPE:用于描述类、接口(包括注解类型) 或enum声明

上面的两个自定义注解分别为TYPE和METHOD,所以,二者的作用域分别为类和方法。在自定义注解中,Target是一个元注解,什么是元注解呢?就是用来注解其他注解的元素,关于注解更详细的介绍,大家可以阅读本文的参考文献。

2.3 写一个简单的自定义注解处理器

package net.javabeat.articles.java6.newfeatures.customannotations; 
import java.util.*;
import javax.annotation.processing.*;
import javax.lang.model.*;
import javax.lang.model.element.*;
 
@SupportedAnnotationTypes(value= {"*"})
@SupportedSourceVersion(SourceVersion.RELEASE_6) 
public class TestAnnotationProcessor extends AbstractProcessor  { 
    @Override
    public boolean process(
        Set annotations, RoundEnvironment roundEnv){ 
        for (TypeElement element : annotations){
            System.out.println(element.getQualifiedName());
        }
        return true;
    }
}

我们看一下上面的代码,首先要注意的是这个自定义注解处理类继承了AbstractProcessor(这里封装了抽象注解处理器),我们需要通过@SupportedAnnotationTypes()方法来指出处理类支持的注解类型。*代表所有的注解类型都可以被这个注解处理器处理;通过@SupportedSourceVersion注解来标记注解处理器所支持的源代码版本。

java6.0的 javac编译器,可以指定一个可选项-processor,用来指定包含注解的一系列java源文件对应的注解处理器,对于我们这个例子,脚本就应该如下所示:

javac -processor  net.javabeat.articles.java6.newfeatures.customannotations.TestAnnotationProcessor   AnnotatedJavaFile.java

从上面的命令中可以看出,注解处理器是TestAnnotationProcessor以及要处理的java源文件是AnnotatedJavaFile.java,在控制台执行这个命令的时候,TestAnnotationProcessor.process()方法将会被调用,在调用这个方法的时候,会把源文件中的注解集合传入。这个处理器完成的作用就是列出示例中java源文件包含的注解类型,运行结果如下所示:

net.javabeat.articles.java6.newfeatures.customannotations.ClassLevelAnnotation
net.javabeat.articles.java6.newfeatures.customannotations.MethodLevelAnnotation

参考文献地址

1.http://www.javabeat.net/2007/06/java-6-0-features-part-2-pluggable-annotation-processing-api/

2.http://www.itzhai.com/java-based-notebook-annotation-annotation-introduction-and-use-custom-annotations.html

3.http://www.cnblogs.com/xd502djj/archive/2012/07/26/2610040.html

4.http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>