AbstractProcessor 用法示例

自定义一个注解,如果此注解需要在编译期检查注解相关的值,可以自定义一个Annotation的处理类,该类在javax.annotation.processing包中,示例如下:

1)自定义一个annotation ,如Version.java

import java.lang.annotation.Documented;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * Created by terryrao on 5/24/2015.
 */
//@Target({ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
@Inherited
@Documented
public @interface Version {
int major () default 1; //主版本号
int minor () default 0; //子版本号

}

建立处理类,当版本的主版本号或者子版本号为负数时,编译不通过。如VersionProcessor.java

import javax.annotation.processing.*;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
import javax.lang.model.element.Name;
import javax.lang.model.element.TypeElement;
import javax.tools.Diagnostic;
import java.util.Set;

/**
 * Created by terryrao on 5/24/2015.
 */
@SupportedAnnotationTypes({"org.raowei.test.annotaionprocessor.annotaions.Version"})
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class VersionProcessor extends AbstractProcessor{

@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
for (TypeElement currentAnnotation : annotations) {
            Name qualifiedName = currentAnnotation.getQualifiedName();
            if (qualifiedName.contentEquals("org.raowei.test.annotaionprocessor.annotaions.Version")){
                Set<? extends Element> annotatedElements = roundEnv.getElementsAnnotatedWith(currentAnnotation);
                for (Element element : annotatedElements) {
Version v = element.getAnnotation(Version.class);
                    int major = v.major();
                    int minor = v.minor();
                    if(major < 0 || minor < 0) {
                        String errMsg = "Version cannot be negative. major = " + major + " minor = " + minor;
Messager messager = this.processingEnv.getMessager();
messager.printMessage(Diagnostic.Kind.ERROR,errMsg,element);
}
                }
            }
        }
return Boolean.TRUE;
}

}

3.服务注册文件 :在resources 下面新增META-INF/services文件夹,新建javax.annotation.processing.Processor 增加自定义处理类的全包名

com.test.annotations.processor.VersionProcessor

4.使用maven打包成jar.

需要注意的是要加上<compilerArgument>-proc:none</compilerArgument>,否则会报错

pom.xml

<build>
  <plugins>
    <plugin>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>2.5.1</version>
      <configuration>
        <source>1.8</source>
        <target>1.8</target>
<!-- Disable annotation processing for ourselves.-->
<compilerArgument>-proc:none</compilerArgument>
      </configuration>
    </plugin>
  </plugins>
</build>

5.完成后可以在其它项目中引用Version,编译器就会检查,如果不通过就会打印error,如下

@Version(major = -1,minor = -1)
public class PoiUtils {

	/**
	 * 从Cell里面获即一个单元格样式,并保留该单元格原来的样式
	 * 
	 * @param cell
	 * @return
	 */
	public static CellStyle getCellStyle(Cell cell) {
		Workbook workbook = cell.getRow().getSheet().getWorkbook();
		CellStyle cellStyle = workbook.createCellStyle();
		cellStyle.cloneStyleFrom(cell.getCellStyle()); // 保留原来的格式
		return cellStyle;
	}

	/**
	 * 从Sheet 中获取指定行,如果没有就创建,有就直接返回已存在的
	 * 
	 * @param sheet 从中获取行的表
	 * @param index 行索引(从0开始)
	 * @return Row
	 */
	public static Row getRow(Sheet sheet, int index) {
		return sheet.getRow(index) == null ? sheet.createRow(index) : sheet.getRow(index);
	}

	/**
	 * 从Row中获取指定单元格,如果没有就创建,有就直接返回已存在的
	 * 
	 * @param row 从中获取单元格的行
	 * @param index 列索引(从0开始)
	 * @return Cell
	 */
	public static Cell getCell(Row row, int index) {
		return row.getCell(index) == null ? row.createCell(index) : row.getCell(index);
	}

}

使用maven打包就会出现错误提示,方便编译时检查错误:

另附参考连接如下:

http://developer.51cto.com/art/201001/177878.htm

http://types.cs.washington.edu/checker-framework

时间: 2024-10-10 17:47:40

AbstractProcessor 用法示例的相关文章

openat与open的区别及用法示例

从2.6.16版本开始,GNU/Linux引入opeant系统调用: #define _XOPEN_SOURCE 700 /* Or define _POSIX_C_SOURCE >= 200809 */ #include <fcntl.h> int openat(int dirfd , const char * pathname , int flags , ... /* mode_t mode */); Returns file descriptor on success, or –1

wxpython布局管理部件wx.gridbagsizer用法示例

text = ("This is text box")         panel = wx.Panel(self, -1)         chkAll1 = wx.CheckBox(panel, ID_CHKBOX_CAN_SEL_ALL, u'全选')                chkKnown = wx.CheckBox(panel, ID_CHKBOX_CAN_UNKNOWN, u'不会')         chkUnknow = wx.CheckBox(panel, I

C#中HashTable的用法示例2

命名空间 System.Collections 名称 哈希表(Hashtable) 描述 用于处理和表现类似keyvalue的键值对,其中key通常可用来快速查找,同时key是区分大小写:value用于存储对应于key的值.Hashtable中keyvalue键值对均为object类型,所以Hashtable可以支持任何类型的keyvalue键值对. 二,哈希表的简单操作 Hashtable hshTable = new Hashtable(); //  创建哈希表hshTable .Add("

Linux中 find 常见用法示例

Linux中find常见用法示例 #find path -option [ -print ] [ -exec -ok command ] {} \; #-print 将查找到的文件输出到标准输出 #-exec command {} \; —–将查到的文件执行command操作,{} 和 \;之间有空格.其实在命令执行的时候"{}"将被find到的结果替换掉,因此将"{}"看成find到的文件来进行操作就很容易理解这个选项了. #-ok 和-exec相同,只不过在操作

C#中HashTable的用法示例1

一,哈希表(Hashtable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对,其中key通常可用来快速查找,同时key是区分大小写:value用于存储对应于key的值.Hashtable中keyvalue键值对均为object类型,所以Hashtable可以支持任何类型的keyvalue键值对. 二,哈希表的简单操作 在哈希表中添加一个keyvalue键值对:HashtableO

oracle中to_date详细用法示例(oracle日期格式转换)

这篇文章主要介绍了oracle中to_date详细用法示例,包括期和字符转换函数用法.字符串和时间互转.求某天是星期几.两个日期间的天数.月份差等用法 TO_DATE格式(以时间:2007-11-02 13:45:25为例) 1. 日期和字符转换函数用法(to_date,to_char) select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as nowTime from dual; //日期转化为字符串 select to_char(sysdate,'

[email&#160;protected] $location.path(&#39;/login&#39;)-$location服务用法示例

$httpProvider interceptor .factory('auth403', ['$rootScope', '$q', '$location', function auth403($rootScope, $q, $location) { return { request: function (config) { console.log(config); var start = new Date(); return config; }, response: function (res

C++11中function和bind的用法示例

环境Visual Studio 2012,具体代码如下 #include <iostream> #include <functional> #include <string> void PrintNumber(int num) { std::cout << num << std::endl; } struct Printer { void Print(std::string print_str) { std::cout << prin

Linux find 用法示例(摘抄)

Linux中find常见用法示例 ·find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \; find命令的参数: pathname: find命令所查找的目录路径.例如用.来表示当前目录,用/来表示系统根目录.-print: find命令将匹配的文件输出到标准输出.-exec: find命令对匹配的文件执行该参数所给出的shell命令.相应命令的形式为'command' { } \;,注意{ }和\:之间的