博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(四) 源码级注解处理
阅读量:4049 次
发布时间:2019-05-25

本文共 4018 字,大约阅读时间需要 13 分钟。

注解的用处之一就是自动生成包含程序额外信息的"附文件"。Java EE 5使用注解极大地简化了编程模型。

源码级注解是将注解处理器添加到Java编译器中。

javac -processor ProcessorClassName1,ProcessorClassName2,... sourceFiles

 

有编译器定位源代码中的注解,然后选择恰当的注解处理器。每个注解处理器会依次执行。如果某哥哥注解处理器创建了一个新的源文件,那么将重复执行这个处理过程。如果某次处理循环没有再产生任何新的源文件,那么就编译所有的源文件。

关于处理器需要指示注释处理器支持哪些注释类型的注释和注释处理器所支持的最新源版本的注释。

@SupportedAnnotationTypes("annotation.Property")    @SupportedSourceVersion(SourceVersion.RELEASE_6)
 

通过一个简单示例来演示这项技术,一个DEMO,可以自动产生bean信息类。可以使用一个注解来标记bean的属性,然后运行某个工具对这个源文件进行解析、分析其注解,最后输出bean信息类的源文件。

 

package com.shaogq.annotation.source;import java.beans.Introspector;import java.io.IOException;import java.io.PrintWriter;import java.util.LinkedHashMap;import java.util.Map;import java.util.Set;import javax.annotation.processing.AbstractProcessor;import javax.annotation.processing.RoundEnvironment;import javax.annotation.processing.SupportedAnnotationTypes;import javax.annotation.processing.SupportedSourceVersion;import javax.lang.model.SourceVersion;import javax.lang.model.element.Element;import javax.lang.model.element.TypeElement;import javax.tools.Diagnostic.Kind;import javax.tools.JavaFileObject;@SupportedAnnotationTypes("com.shaogq.annotation.Property")@SupportedSourceVersion(SourceVersion.RELEASE_6)public class BeanInfoAnnotationFactory extends AbstractProcessor{    @Override    public boolean process(Set
annotations, RoundEnvironment roundEnv) { for(TypeElement t : annotations){ Map
props = new LinkedHashMap
(); String beanClassName = null; for(Element e:roundEnv.getElementsAnnotatedWith(t)){ String mname = e.getSimpleName().toString(); String[] prefixes = {"get", "set" , "is"}; boolean found = false; for(int i=0;!found && i
props) throws IOException{ JavaFileObject sourceFile = processingEnv.getFiler().createSourceFile( beanClassName + "BeanInfo"); PrintWriter out = new PrintWriter(sourceFile.openWriter()); int i = beanClassName.lastIndexOf("."); if(i>0){ out.print("package "); out.print(beanClassName.substring(0, i)); out.print(";"); } out.print("public class "); out.print(beanClassName.substring(i + 1)); out.println("BeanInfo extends java.beans.SimpleBeanInfo"); out.print("{"); out.print(" public java.beans.PropertyDescriptor[] getPropertyDescriptors(){"); out.println(" try{"); for(Map.Entry
e :props.entrySet()){ out.print(" java.beans.PropertyDescriptor"); out.print(e.getKey()); out.println("Descriptor"); out.print(" = new java.beans.PropertyDescriptory(\""); out.print(e.getKey()); out.print("\", "); out.print(beanClassName); out.println(".class);"); String ed = e.getValue().editor().toString(); if(!ed.equals("")){ out.print(" "); out.print(e.getKey()); out.print("Descriptor.setPropertyEditorClass("); out.print(ed); out.println(".class);"); } } out.println(" return new java.beans.PropertyDescriptor[]{"); boolean first = true; for(String p : props.keySet()){ if(first){ first = false; }else{ out.print(","); } out.println(); out.print(" "); out.print(p); out.print("Descriptor"); } out.println(); out.println(" };"); out.println(" }"); out.println(" catch(java.beans.IntrospectionException e){"); out.println(" e.printStackTrace();"); out.println(" return null;"); out.println(" }"); out.println(" }"); out.println("}"); out.close(); } }
 

 

 

转载地址:http://hayci.baihongyu.com/

你可能感兴趣的文章
Springboot的仓库管理系统——计算机类专业课程设计(毕业设计)
查看>>
刷新页面实现方式总结(HTML,ASP,JS)
查看>>
根据地球上两个地点的经度和纬度,如何获得这两点的距离?
查看>>
COM组件的使用
查看>>
关于文件夹的手动隐藏和恢复
查看>>
JavaScript和Jscript的版本及规范
查看>>
WinCE 对 Java脚本的支持
查看>>
XML学习
查看>>
ASP中LIST控件
查看>>
ASP中按钮触发事件
查看>>
学习:GPIO口模拟I2C
查看>>
展望2007
查看>>
做个男人
查看>>
转:S3C2410 bootloader ----VIVI阅读笔记
查看>>
转:嵌入式系统 Boot Loader 技术内幕
查看>>
ARM 的宏定义
查看>>
SIGN UP BEC2
查看>>
S3C2440中对LED驱动电路的理解
查看>>
《天亮了》韩红
查看>>
Windows CE下USB摄像头驱动开发(以OV511为例,附带全部源代码以及讲解) [转]
查看>>