Android APT不能自动生成文件

  • 添加依赖
  • Annotation为Java library Module,很简单
  • 还有一个Android library Module 命名为apt-lib
  • 注解处理器(Complier)
  • 寻找不能自动生成文件的问题
  • 自动生成的LuacherActivity$ViewBinder类
  • 参考

最近学习(Annotation Processing Tool)即注解处理器,在写一个小Demo的时候。写完代码,无论怎么Build都不能自动生成所需要的文件,于是各种检查寻找问题。

添加依赖

在处理注解的Java library Module 名字为Complier,添加依赖

    dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])implementation 'com.google.auto.service:auto-service:1.0-rc5'implementation project(path: ':Annotation')}//中文乱码问题(错误:编码GBK不可映射字符)
tasks.withType(JavaCompile) {options.encoding = "UTF-8"
}
sourceCompatibility = "8"
targetCompatibility = "8"

Annotation为Java library Module,很简单

@Target(ElementType.FIELD) //作用于属性上
@Retention(RetentionPolicy.CLASS) //作用于编译期,.class 存在于apk中
public @interface BindView {int value();
}

还有一个Android library Module 命名为apt-lib

主要有一个类ButterKnife和一个接口ViewBinder,代码如下:
1.ButterKnife.java

public class ButterKnife {public static void bind(Activity activity) {String className = activity.getClass().getName() + "$ViewBinder";try {Class<?> aClass = Class.forName(className);ViewBinder viewBinder = (ViewBinder) aClass.newInstance();viewBinder.bind(activity);} catch (Exception e) {e.printStackTrace();}}
}

2.ViewBinder.java

public interface ViewBinder<T> {void bind(T t);
}

注解处理器(Complier)

里面只有一个类ButterKnifeProcessor

@AutoService(Processor.class)//加上这个注解才能去执行
public class ButterKnifeProcessor extends AbstractProcessor {private Elements elementUtils;  //Elements中包含用于操作的工具private Filer filer;        //用来创建新的源文件,class以及其他文件@Overridepublic synchronized void init(ProcessingEnvironment processingEnvironment) {super.init(processingEnvironment);//此方法主要是去初始化需要用到的工具elementUtils = processingEnvironment.getElementUtils();filer = processingEnvironment.getFiler();}@Overridepublic Set<String> getSupportedAnnotationTypes() {//添加支持的注解类型Set<String> setTypes = new LinkedHashSet<>();setTypes.add(BindView.class.getCanonicalName()):return setTypes;}@Overridepublic SourceVersion getSupportedSourceVersion() {//用哪个版本的jdk编译return SourceVersion.RELEASE_8;}/*** 注解处理器的核心方法,处理具体的注解,生成新的 Java Class文件*/@Overridepublic boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {try {JavaFileObject fileObject = filer.createSourceFile("LuacherActivity$ViewBinder");//获取writer,wirter就类似一支笔,去写java文件里的每一行代码Writer writer = fileObject.openWriter();writer.write("package com.lyh.apt;\n");      //包名writer.write("\n");writer.write("import com.liyh.aptlib.ViewBinder;\n");//导包writer.write("\n");writer.write("import com.lyh.apt.LuacherActivity;\n");writer.write("\n");writer.write("import com.lyh.apt.R;\n");writer.write("\n");writer.write("public class LuacherActivity$ViewBinder implements ViewBinder<LuacherActivity> {\n");writer.write("    @Override\n");writer.write("    public void bind(LuacherActivity target) {\n");writer.write("        target.tvText = target.findViewById(R.id.tv_text);\n}\n");writer.write("}");//最后不要忘记关流writer.flush();writer.close();} catch (IOException e) {e.printStackTrace();}return false;}
}

当然目前我只是把代码写死了,真正实现可以从参数RoundEnvironment中获取到注解的类,这里只是想看下这Writer的用法。具体实现可以参考
【Android】APT https://www.jianshu.com/p/7af58e8e3e1
主要是重写init(ProcessingEnvironment processingEnvironment),getSupportedAnnotationTypes(),getSupportedSourceVersion()以及process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment)这四个方法

寻找不能自动生成文件的问题

  1. @AutoService(Processor.class),这个注解必须添加,否则注解处理器不能执行;

  2. 最后写完wirter的流没有关闭,会造成生成文件,但文件内容为空,或者不全;

  3. app Module 要添加之前的三个Library依赖,如下:

     implementation project(path: ':aptlib')implementation project(path: ':Annotation')annotationProcessor project(path: ':Complier')
    

以上我反复检查了N次,确认无误仍然不能编译生成想要看到的文件,最后找个大神请教下。
说是Android Gradle及构建版本问题,我的是3.4.1 + 5.2.1,会出现不兼容的情况,大神建议3.3.2 + 4.10.1以下都可以。
听了建议降低版本果然构建编译,新的文件生成了。

自动生成的LuacherActivity$ViewBinder类

package com.lyh.apt;import com.lyh.aptlibViewBinder;
import com.lyh.apt.LuacherActivity;
import com.lyh.apt.R;
public class LuacherActivity$ViewBinder implements ViewBinder<LuacherActivity> {@Overridepublic void bind(LuacherActivity target) {target.tvText = target.findViewById(R.id.tv_text);}
}

生成文件目录为:

参考

https://www.jianshu.com/p/7af58e8e3e18

此篇文章仅记录问题解决方法,希望对其他人有所帮助,不要像我一样,浪费了大半个晚上,还只是做无用功。

Android APT不能自动生成文件相关推荐

  1. android getter不起作用,java - 如何在Android Studio中自动生成getter和setter

    java - 如何在Android Studio中自动生成getter和setter Android Studio中是否有一个快捷方式可以自动生成给定类中的getter和setter? 14个解决方案 ...

  2. mybatis-plus自动生成文件

    mybatis-plus自动生成文件 package com.common;import com.baomidou.mybatisplus.annotation.IdType; import com. ...

  3. jsp界面自动生成文件注释_实施注释界面

    jsp界面自动生成文件注释 对于Java开发人员而言,每天都需要使用注释. 如果没有其他简单的@Override注释,那该响了. 创建注释要复杂一些. 在运行时通过反射使用"自制" ...

  4. php生成excel到服务器,yii phpexcel自动生成文件保存到服务器上

    yii phpexcel自动生成文件保存到服务器上 最近再整一个报表任务,每天必须把表导出来按excel格式发送邮件给管理员,利用phpexcel把表保存到服务器上,然后再通过phpmailer发送就 ...

  5. ftp服务器生成文件,ftp服务器自动生成文件

    ftp服务器自动生成文件 内容精选 换一换 本节操作介绍如何在Windows操作系统的本地主机上使用FTP上传文件到云服务器.已在待上传文件的云服务器中搭建 FTP 服务.如果您的云服务器为 Wind ...

  6. Mybatis-generator,自动生成文件.问题及解决

    Mybatis-generator,自动生成文件.问题及解决 参考文章: (1)Mybatis-generator,自动生成文件.问题及解决 (2)https://www.cnblogs.com/ch ...

  7. Android开发实例-自动生成题库的数独

    本系列文章主要介绍如何利用Android开发一个自动生成题目的数独游戏.涉及的知识和技术如下所示: 挖洞算法自动生成数独题目实现自定义View用于绘制数独盘数据库的基本操作 看着市场上千篇一律的数独应 ...

  8. Python创建文件时自动生成文件信息

    Python创建文件时自动生成文件信息 在创建python脚本文件时,对文件初始化自动生成一些文件信息来进行设置 1 打开路径 2 调整面板 3 面板填写样式 参考链接 Pycharm创建文件时自动生 ...

  9. eclipse android 不会自动生成R.java文件和包的解决办法

    eclipse下编写android程序突然不会自动生成R.java文件和包的解决办法 我的eclipse原来是好好的,什么问题都没有的,结果今天一打开新建一个android程序,发现工程里不会自动生成 ...

最新文章

  1. .ARM.exidx
  2. 服务器搭建邮件自动回复,在postfix邮件系统上搭建自动回复邮件系统
  3. JQuery中ajax方法访问web服务
  4. 从清明节到儿童节,打造一个童话城市
  5. 统计个人已完成的工作量_已注销注册人数统计(勘察设计类)2019.4.11
  6. 基于HTML5实现的超酷摄像头(HTML5 webcam)拍照功能 - photobooth.js
  7. Oracle视图分类及各种操作讲解(超级好文)
  8. JavaScript 精粹
  9. ORACLE ASM 转自三思笔记
  10. 【工具分享】一个阿里出品的免费在线图表制作工具(ChartCube 图表魔方)
  11. 使用百度识图 完成图片识别和文字识别
  12. flyingsaucer转换多个html,用 flying saucer 生成pdf文件 Css及html的问题
  13. 小冰的忍者团队,她在日本开启了怎样一种商业模式?
  14. 见缝插针小程序php,抖音小程序怎么开通
  15. PTA 7-13 列车调度 (25 分) C语言和C++实现(二分查找)
  16. Java是什么?Java的特点有哪些?
  17. POJ 1265 Area
  18. 锁定计算机好在下游戏吗,求一款能让电脑在某一时段锁定不能玩游戏的软件
  19. CSS translation
  20. 美国早期电子商务成功案例今昔:网上卖鞋的成就

热门文章

  1. 频点、带宽、FFT点数、采样率的关系
  2. 图集 | 航拍玉林29所学校,里面有你的母校吗?
  3. Linux 文件夹右下角有锁,解锁
  4. 从零开始写高性能的人脸识别服务器(一)
  5. 运单状态机设计及全流程异常跟踪整体架构
  6. linux下查找文件并按时间顺序排序的方法
  7. 跳动爱心代码-李峋同款爱心代码(升级版)
  8. 校验集装箱号合法性-php版
  9. 一名中专生的坎坷程序人生(下)
  10. 【樂理】中國古典音樂樂理