博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
学习Butterknife的一点心得(系列)一
阅读量:6140 次
发布时间:2019-06-21

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

hot3.png

我们实现一个完整的一个例子,那么基本了解了其运行机制。

1  创建一个处理注解的项目

    180003_mSGr_1463920.png

依次为一个注解,一个注解处理器,一个注解路径配置文件(供编译器识别)。

注解Seriable代码:

@Target({ ElementType.FIELD, ElementType.TYPE })  @Retention(RetentionPolicy.CLASS) public @interface Seriable {}

@Retention标明生命周期,

RetentionPolicy.CLASS //表示注解是在编译期处理

这个配置文件的内容是BeanProcessor.java的完整路径:com.zhy.annotationprocess.processor.BeanProcessor.

这个BeanProcessor.java的代码为:

@SupportedSourceVersion(SourceVersion.RELEASE_6)public class BeanProcessor extends AbstractProcessor { // 元素操作的辅助类	Elements elementUtils;	ProcessingEnvironment  processingEnv;		@Override	public synchronized void init(ProcessingEnvironment processingEnv) {		super.init(processingEnv);		// 元素操作的辅助类		elementUtils = processingEnv.getElementUtils();		this.processingEnv = processingEnv;			}	@Override	public Set
 getSupportedAnnotationTypes() { Set
 typeSet = new LinkedHashSet
(); typeSet.add(Seriable.class.getCanonicalName()); return typeSet; } @SuppressWarnings("resource") @Override public boolean process(Set
 annotations, RoundEnvironment roundEnv) { processingEnv.getMessager().printMessage(Kind.ERROR, "12346789"); // 获得被该注解声明的元素 Set
 elememts = roundEnv .getElementsAnnotatedWith(Seriable.class); TypeElement classElement = null;// 声明类元素 List
 fields = null;// 声明一个存放成员变量的列表 // 存放二者 Map
> maps = new HashMap
>(); try { // 遍历 File file = new File("f:/test.txt"); FileWriter fWriter = null; fWriter = new FileWriter(file,true); FileOutputStream outputStream = new FileOutputStream(file,true); outputStream.write((" ======elememts size : " +elememts.size()+ "\n").getBytes()); int i = 1; for (Element ele : elememts) { //processingEnv.getMessager().printMessage(Kind.ERROR, "12346789",ele); outputStream.write((" ======start\n").getBytes()); outputStream.write((" element name:" + ele.getSimpleName() + " index:" + i + "\n").getBytes()); outputStream.write((" element enclose_name:"+ele.getEnclosingElement().getSimpleName()+"\n").getBytes()); outputStream.write(( "element kind:" + ele.getKind().name() + "\n").getBytes()); outputStream.write(( " element type:" + ele.asType().getKind().name() + "\n").getBytes()); outputStream.write(("========end\n").getBytes()); i++; } outputStream.flush(); outputStream.close(); } catch (IOException e) { e.printStackTrace(); } return true; }}

然后将其打成一个jar。

2  创建一个测试简单注解框架的项目

  180921_kOeY_1463920.png

percent_1.jar就是刚才打的jar包

Article.java和User.java的代码分别为:

@Seriable  public class Article  {       private String title ;              private String content ;        }   public class User   {      @Seriable     int username123;                @Seriable       String password123;        private String three;       private String four;   }

对AnntotaionTest1项目配置,使编译器能识别jar中的注解处理器BeanProcessor。

092322_FAGc_1463920.png

092323_58Xn_1463920.png

配置完之后回头看BeanProcessor,编译器识别它之后,会调用它的process(...)入口,根据代码会在F盘创建一个test.txt文件,里面打印了被注解的元素的信息。现在我们来看一下这个文件的内容:

 ======elememts size : 3

 ======start

 element name:username123 index:1

 element enclose_name:User

element kind:FIELD

 element type:INT

========end

 ======start

 element name:Article index:2

 element enclose_name:com

element kind:CLASS

 element type:DECLARED

========end

 ======start

 element name:password123 index:3

 element enclose_name:User

element kind:FIELD

 element type:DECLARED

========end

 ======elememts size : 0

果然打印出了3条注解元素的信息,这和我们在User和Article注解的元素一一对应。

这里解释一下:element name的值意思为注解元素的名称,element enclose_name:是封装这个元素的实体名称,element kind的值被注解元素的角色,字段或者类等其他,element type:的值表示被注解元素的类型,username123被定义成int,它的type就为INT,password123被定义成String,它的type就为DECLARED。至此简单的编译注解完成测试。在写注解处理器的时候有一点要注意,就是必须实现getSupportedAnnotationTypes()方法

转载于:https://my.oschina.net/u/1463920/blog/512704

你可能感兴趣的文章
UnrealEngine4.5 BluePrint初始化中遇到编译警告的解决办法
查看>>
User implements HttpSessionBindingListener
查看>>
抽象工厂方法
查看>>
ubuntu apt-get 安装 lnmp
查看>>
焊盘 往同一个方向增加 固定的长度方法 总结
查看>>
eclipse的maven、Scala环境搭建
查看>>
架构师之路(一)- 什么是软件架构
查看>>
jquery的冒泡和默认行为
查看>>
USACO 土地购买
查看>>
【原创】远景能源面试--一面
查看>>
B1010.一元多项式求导(25)
查看>>
10、程序员和编译器之间的关系
查看>>
前端学习之正则表达式
查看>>
配置 RAILS FOR JRUBY1.7.4
查看>>
AndroidStudio中导入SlidingMenu报错解决方案
查看>>
修改GRUB2背景图片
查看>>
Ajax异步
查看>>
好记性不如烂笔杆-android学习笔记<十六> switcher和gallery
查看>>
JAVA GC
查看>>
codeforce 599B Spongebob and Joke
查看>>