收藏 分享(赏)

java apt.doc

上传人:hskm5268 文档编号:6620748 上传时间:2019-04-18 格式:DOC 页数:6 大小:59.50KB
下载 相关 举报
java apt.doc_第1页
第1页 / 共6页
java apt.doc_第2页
第2页 / 共6页
java apt.doc_第3页
第3页 / 共6页
java apt.doc_第4页
第4页 / 共6页
java apt.doc_第5页
第5页 / 共6页
点击查看更多>>
资源描述

1、JAVA APT 处理 Annotation使用 APT 处理 AnnotationAPT(Annotation processing tool) 是一种处理注释的工具,它对源代码文件进行检测找出其中的 Annotation,使用 Annotation 进行额外的处理。Annotation 处理器在处理Annotation 时可以根据源文件中的 Annotation 生成额外的源文件和其它的文件(文件具体内容由 Annotation 处理器的编写者决定),APT 还会编译生成的源文件和原来的源文件,将它们一起生成 class 文件.使用 APT 主要的目的是简化开发者的工作量,因为 APT 可

2、以编译程序源代码的同时,生成一些附属文件(比如源文件,类文件,程序发布描述文件等 ),这些附属文件的内容也都是与源代码相关的,换句话说,使用 APT 可以代替传统的对代码信息和附属文件的维护工作。如果有过 Hibernate 开发经验的朋友可能知道每写一个 Java 文件,还必须额外地维护一个 Hibernate 映射文件( 一个名为*.hbm.xml 的文件,当然可以有一些工具可以自动生成),下面将使用 Annotation 来简化这步操作。为了使用系统的 apt 工具来读取源文件中的 Annotation,程序员必须自定义一个 Annotation 处理器,编写 Annotation 处理

3、器需要使用 JDK lib 目录中的 tools.jar 里的如下 4 个包.com.sun.mirror.apt: /和 APT 交互的接口com.sun.mirror.declaration: /包含各种封装类成员,类方法,类声明的接口。com.sun.mirror.type: /包含各种封装源代码中程序元素的接口。com.sun.mirror.util: /提供了用于处理类型和声明的一些工具。每个 Annotation 处理器需要实现 com.sun.mirror.apt 包下的 AnnotationProcessor 接口,这个接口中定义了一个“process“方法,该方法是由 apt

4、 调用 Annotation 处理器时将被用到的。一个 Annotation 处理器可以处理一种或多种 Annotation 类型。1. 通常情况下,Annotation 处理器实例是由其相应的工厂返回,Annotation 处理器工厂应该实现 AnnotationProcessorFactory 接口,APT 将调用工厂类的 getProcessorFor 方法来获得Annotation 处理器。2. 在调用过程中,APT 将提供给工厂类一个 AnnotationProcessorEnvironment 对象.3. AnnotationProcessorEnvironment 对象是 APT

5、 工具与注释环境通信的途径。使用 APT 工具来处理源文件时,APT 首先检测在源代码文件中包含哪些 Annotation,然后 APT 将查找所需的处理器工厂,并由工厂来返回相应的 Annotation 处理器。如果该处理器工厂支持这些 Annotaion,处理器工厂返回的 Annotaion 处理器将会处理这些Annotation,如果生成的源文件中再次包含 Annotaion,APT 将会重复上面过程,直至没有新文件生成。为了说明使用 APT 来根据源文件中的注释来生成额外的文件,下面将定义三个Annotation 类型,分别用于修饰持久化类,标识属性和普通属性。程序清单修饰表属性imp

6、ort java.lang.annotation.*;DocumentedTarget(ElementType.TYPE)Retention(RetentionPolicy.SOURCE)public interface Persistent String table();修饰标识属性import java.lang.annotation.*;DocumentedTarget(ElementType.FIELD)Retention(RetentionPolicy.SOURCE)public interface IdProperty String column();String type();S

7、tring generator();修饰普通成员变量的 Annotationimport java.lang.annotation.*;DocumentedTarget(ElementType.FIELD)Retention(RetentionPolicy.SOURCE)public interface Property String column();String type();定义了三个 Annotation 之后,下面我们提供一个简单的 Java 类文件,这个 Java 类文件使用了上面三个 Annotation 来修饰Persistent(table=“persons_table“)p

8、ublic class Person IdProperty(column=“person_id“,type=“integer“,generator=“identity“)private int id;Property(column=“person_name“,type=“string“)private String name;Property(column=“person_age“,type=“integer“)private int age;/ omit constructor and get ang set method上面 Person 类是一个非常普通的 Java 类,但这个普通的 J

9、ava 类使用了Persistent,IdProperty,IdPropery 三个 Annotation。下面我们为这三个 Annotation 提供了一个 Annotation 处理器,该处理器的功能是根据注释来生成一个 Hibernate 的映射文件.程序清单import com.sun.mirror.apt.*;import com.sun.mirror.declaration.*;import com.sun.mirror.type.*;import com.sun.mirror.util.*;import java.beans.*;import java.io.*;import j

10、ava.util.*;import java.lang.reflect.*;public class HibernateAnnotationProcessor implements AnnotationProcessor / Annotation 处理器环境,是该处理器与 APT 交互的重要途径private AnnotationProcessorEnvironment env;/ 构造 HibernateAnnotationProcessor 对象时,获得处理器环境public HibernateAnnotationProcessor(AnnotationProcessorEnvironme

11、nt env) this.env = env;/ 循环处理每个对象public void process() / 遍历每个 class 文件for (TypeDeclaration t : env.getSpecifiedTypeDeclarations() / 定义一个文件输出流,用于生成额外的文件FileOutputStream fos = null;/ 获取正在处理的类名String clazzName = t.getSimpleName();/ 获取类定义前的 Persistent AnnotationPersistent per = t.getAnnotation(Persisten

12、t.class);/ 当 per Annotation 不为空时才继续处理if(per != null) try / 创建文件输出流fos = new FileOutputStream(clazzName + “.hbm.xml“);PrintStream ps = new PrintStream(fos);/ 执行输出ps.println(“);ps.println(“);ps.println(“);ps.print(“ “);for (FieldDeclaration f : t.getFields() / 获取指定 FieldDeclaration 前面的 IdProperty Anno

13、tationIdProperty id = f.getAnnotation(IdProperty.class);/ 如果 id Annotation 不为空if (id != null) / 执行输出ps.println(“ “);ps.println(“ “);ps.println(“ “);/ 获取指定 FieldDeclaration 前面的 Property AnnotationProperty p = f.getAnnotation(Property.class);/ 如果 p Annotation 不为空if (p != null) / 执行输出ps.println(“ “); p

14、s.println(“ “);ps.println(“); catch (Exception e) e.printStackTrace(); finally / 关闭输出流try if (fos != null) fos.close(); catch (IOException ex) ex.printStackTrace(); 上面的 Annotation 处理器比较简单,与前面通过反射来获取 Annotation 信息不同的是,这个 Annotation 处理器使用 AnnotationProcessorEnvironment 来获取 Annotation 信息,AnnotationProc

15、essorEnvironment 包含了一个 getSpecifiedTypeDeclarations 方法,可获取所有需要处理的类声明,这个类声明可包括类,接口,和枚举等声明,由 TypeDeclaration 对象表地示,与 Classc 对象的功能大致相似,区别只是 TypeDeclaration 是静态,只要有类文件就可以获得该对象,而 Class 是动态的,必须由虚拟机装载了指定类文件后才会产生。TypeDeclaration 又包含了如下三个常用方法来获得对应的程序元素。getFields: 获取该类声明里的所有成员变量声明,返回值是集合元素 FieldDeclaration 的集

16、合getMethods: 获取该类声明里的所有成员声明,返回值是集合元素 MethodDeclaration 的集合getPackage: 获取该类声明里的包声明,返回值是 TypeDeclaration上面三个方法返回的 TypeDeclaration,FieldDeclaration,MethodDeclaration 都可调用getAnnotation 方法来访问修饰它们的 Annotation,上面程序中就是获取不同程序元素的Annotation 的代码。提供了上面的 Annotation 处理器类之后,还应该为该 Annotation 处理器提供一个处理工厂,处理工厂负责决定该处理器

17、支持哪些 Annotation,并通过 getProcessorFor 方法来生成一个 Annotation 处理哭对象。程序清单如下import com.sun.mirror.apt.*;import com.sun.mirror.declaration.*;import com.sun.mirror.type.*;import com.sun.mirror.util.*;import java.beans.*;import java.io.*;import java.util.*;public class HibernateAnnotationFactory implements Anno

18、tationProcessorFactory /所有支持的注释类型public Collection supportedAnnotationTypes() return Arrays.asList(“Property“ , “IdProperty“ , “Persistent“);/返回所有支持的选项public Collection supportedOptions() return Arrays.asList(new String0);/返回 Annotation 处理器public AnnotationProcessor getProcessorFor(Set atds,Annotati

19、onProcessorEnvironment env) return new HibernateAnnotationProcessor(env); 提供了上面的处理器工厂后,就可以使用 APT 工具来处理上面的 Person.java 源文件,并根据该源文件来生成一个 XML 文件。 APT 工具位于 JDK 的安装路径的 bin 路径下。 。运行 APT 命令时,可以使用-factory 选项来指定处理器工厂类如下所示 run.cmdrem 使用 HibernateAnnotationFactory 作为处理器工厂来处理 Person.java 中的 Annotationapt -factory HibernateAnnotationFactory Person.java使用 APT 工具,HibernateAnnotationFactory 工厂来处理 Person.java 后,将可以看到在相同路径下,生成了一个 Person.hbm.xml 文件了,该文件内容如下最后在磁盘上的目录格式如下图:注:在运行上图中的 run.cmd 文件中,如果出现某些类没有编译成.class 文件,则需要手功通过 javac myClass.java 进行编译,最后得到的 Person.hbm.xml 就是我们所要的文件。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报