Android APT不能自动生成文件
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)这四个方法
寻找不能自动生成文件的问题
@AutoService(Processor.class),这个注解必须添加,否则注解处理器不能执行;
最后写完wirter的流没有关闭,会造成生成文件,但文件内容为空,或者不全;
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不能自动生成文件相关推荐
- android getter不起作用,java - 如何在Android Studio中自动生成getter和setter
java - 如何在Android Studio中自动生成getter和setter Android Studio中是否有一个快捷方式可以自动生成给定类中的getter和setter? 14个解决方案 ...
- mybatis-plus自动生成文件
mybatis-plus自动生成文件 package com.common;import com.baomidou.mybatisplus.annotation.IdType; import com. ...
- jsp界面自动生成文件注释_实施注释界面
jsp界面自动生成文件注释 对于Java开发人员而言,每天都需要使用注释. 如果没有其他简单的@Override注释,那该响了. 创建注释要复杂一些. 在运行时通过反射使用"自制" ...
- php生成excel到服务器,yii phpexcel自动生成文件保存到服务器上
yii phpexcel自动生成文件保存到服务器上 最近再整一个报表任务,每天必须把表导出来按excel格式发送邮件给管理员,利用phpexcel把表保存到服务器上,然后再通过phpmailer发送就 ...
- ftp服务器生成文件,ftp服务器自动生成文件
ftp服务器自动生成文件 内容精选 换一换 本节操作介绍如何在Windows操作系统的本地主机上使用FTP上传文件到云服务器.已在待上传文件的云服务器中搭建 FTP 服务.如果您的云服务器为 Wind ...
- Mybatis-generator,自动生成文件.问题及解决
Mybatis-generator,自动生成文件.问题及解决 参考文章: (1)Mybatis-generator,自动生成文件.问题及解决 (2)https://www.cnblogs.com/ch ...
- Android开发实例-自动生成题库的数独
本系列文章主要介绍如何利用Android开发一个自动生成题目的数独游戏.涉及的知识和技术如下所示: 挖洞算法自动生成数独题目实现自定义View用于绘制数独盘数据库的基本操作 看着市场上千篇一律的数独应 ...
- Python创建文件时自动生成文件信息
Python创建文件时自动生成文件信息 在创建python脚本文件时,对文件初始化自动生成一些文件信息来进行设置 1 打开路径 2 调整面板 3 面板填写样式 参考链接 Pycharm创建文件时自动生 ...
- eclipse android 不会自动生成R.java文件和包的解决办法
eclipse下编写android程序突然不会自动生成R.java文件和包的解决办法 我的eclipse原来是好好的,什么问题都没有的,结果今天一打开新建一个android程序,发现工程里不会自动生成 ...
最新文章
- .ARM.exidx
- 服务器搭建邮件自动回复,在postfix邮件系统上搭建自动回复邮件系统
- JQuery中ajax方法访问web服务
- 从清明节到儿童节,打造一个童话城市
- 统计个人已完成的工作量_已注销注册人数统计(勘察设计类)2019.4.11
- 基于HTML5实现的超酷摄像头(HTML5 webcam)拍照功能 - photobooth.js
- Oracle视图分类及各种操作讲解(超级好文)
- JavaScript 精粹
- ORACLE ASM 转自三思笔记
- 【工具分享】一个阿里出品的免费在线图表制作工具(ChartCube 图表魔方)
- 使用百度识图 完成图片识别和文字识别
- flyingsaucer转换多个html,用 flying saucer 生成pdf文件 Css及html的问题
- 小冰的忍者团队,她在日本开启了怎样一种商业模式?
- 见缝插针小程序php,抖音小程序怎么开通
- PTA 7-13 列车调度 (25 分) C语言和C++实现(二分查找)
- Java是什么?Java的特点有哪些?
- POJ 1265 Area
- 锁定计算机好在下游戏吗,求一款能让电脑在某一时段锁定不能玩游戏的软件
- CSS translation
- 美国早期电子商务成功案例今昔:网上卖鞋的成就