java fields是_一个快速生成R2.java中fields的插件
一个快速生成R2.java中fields的插件
项目地址:github.com/JeasonWong/…
介绍
在子 module 中使用 ButterKnife 时,如果想使用 ButterKnife 提供的编译期注解,那么就得使用 ButterKnife 的 gradle 插件所生成的R2.java,比如@BindView(R2.id.xxx),关于更多 R.java 与 R2.java 的资料可以看我这篇文章 R.java、R2.java是时候懂了。
当我们在子 module 中新增资源 id 时使用 R2.id.xxx 会报红,报红的原因是 R2.java 是依赖 R.java 生成的,必须重新 build project 生成全新的 R2.java,但这样耗时太久了,大点的工程基本需要四五分钟,报红又使强迫症实在看不下去,那么 R2Assistant 就是来解决这个问题的,使用这个插件可以快速生成 R2.java 中还不存在的 fileds,从而提高工作效率。
演示
使用
在主工程的 build.gradle 中添加插件
apply plugin:'me.wangyuwei.r2assistant'
buildscript{
repositories{
maven{
url'https://dl.bintray.com/wangyuwei/maven'
}
}
dependencies{
classpath'me.wangyuwei:r2assistant-plugin:1.0.0'
}
}
运行命令
如果你想对所有的子 module 生效,执行./gradlew sweepR2
如果你只想对指定的子 module 生效,执行./gradlew sweepR2-PmoduleName=${subModuleName}
原理
原理其实很简单,基本利用正则表达式。
1、写出@BindView(R2.id.xxx) 的正则 R2\.id\.([\w]*
2、遍历 /src/main/java 下的所有 java 文件,并找出所有匹配 1 中正则的资源名:
FilesrcDir=newFile(subProject.projectDir.path.toString()+"/src/main/java")
srcDir.eachFileRecurse(FileType.FILES){Filefile->
if(file.toString().endsWith(".java")){
StringfileContent=newString(file.bytes)
Patternp=Pattern.compile(FIELD_SRC_ID_REGEX)
Matcherm=p.matcher(fileContent)
while(m.find()){
srcFieldsSet.add(m.group(1))
}
}
}
3、写出子 module 对应的R2.java 中 id 的正则 ,如@IdRes
publicstaticfinalintaction_bar=0x7f0a004f;,对应的正则是:@IdRes[\s]*publicstaticfinalint([\w]*)=*[\w]*;
4、找出子 module 对应的R2.java 中 符合 2 中正则的资源名:
Filer2File=newFile(subProject.buildDir.path.toString()+"/generated/source/r/debug/"+packageName.replaceAll("\\.","/")+"/R2.java")
Stringr2Content=newString(r2File.bytes)
Patternp=Pattern.compile(FIELD_R2_REGEX)
Matcherm=p.matcher(r2Content)
while(m.find()){
r2FieldsSet.add(m.group(1))
}
5、找出 /src/main/java 下的新增资源:
srcFieldsSet.each{
if(!r2FieldsSet.contains(it)){
R2Log.log("add filed: ${it}")
generateFieldsSet.add(it)
}
}
6、在 R2.java 中生成新的 filed ,新增 filed 的值可以随便撸,反正运行时用不着:
defSTR_CLASS_ID='''public static final class id {'''
intindex=r2Content.indexOf(STR_CLASS_ID)
StringBuildersb=newStringBuilder()
sb.append(r2Content.substring(0,index+STR_CLASS_ID.length()))
generateFieldsSet.each{
sb.append("\n\t@IdRes\n\tpublic static final int ${it} = 0x7f888888;\n")
}
sb.append(r2Content.substring(index+STR_CLASS_ID.length(),r2Content.length()))
r2File.delete()
r2File.withWriter(StandardCharsets.UTF_8.name()){writer->
writer.write(sb.toString())
}
7、简单吧。
尾语
实现这个功能其实有很多方案,我的这种并不是最好的,我目前想的一个不错的方案是监听 xml 里的变化,如果有新增资源 id ,而这个 id 在 R2.java 中又不存在,那么自动添加这个 field,而不用现在这样执行一个task,感兴趣的同学可以做做。
来源: https://juejin.im/entry/5a2496a4f265da432e5bd51f
java fields是_一个快速生成R2.java中fields的插件相关推荐
- java treelist 排序_一个很好的Java排序列表
我正在寻找Java的良好排序列表.到处搜寻可以给我一些有关使用TreeSet / TreeMap的提示.但是这些组件缺少一件事:随机访问集合中的元素.例如,我想访问排序集中的第n个元素,但是使用Tre ...
- java 判断类型_如何快速入门Java编程学习(干货)
一.初识Java 1.生活中的程序: 从起床到教室上课的过程 穿衣打扮>起床>洗漱>出宿舍>>吃早餐>到教室 按照特定的顺序去完成某一件事的过程我们叫做生活中的程序 ...
- JAVA利用google的zxing快速生成QRCode
利用google的zxing快速生成QRCode 1.导入jar包,如果是非maven工程就去mvnrepository.com搜索zxing,下载本jar包即可 <dependency> ...
- 零基础学java web开发_从零基础学Java成为一个专业的java web 开发者
原标题:从零基础学Java成为一个专业的java web 开发者 "我怎么才能成为一个Java Web开发者?"对于这个问题,答案其实并不简单.成为一个Java Web开发人员包括 ...
- java鉴权_一个开箱即用的高效认证鉴权框架,专注于restful api的认证鉴权动态保护...
作者:tomsun28 来源:SegmentFault 思否 写在开头 看了看这个专栏的最近一篇文章已经是两年前了,时间过得好快.应该是出学校后时间就很快了.两年前因为用shiro后,自己就按着想法开 ...
- java不规则算法_分布式id生成算法 snowflake 详解
背景 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识.如在支付流水号.订单号等,随者业务数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数据库的自增ID显然不能满足需 ...
- java项目学习_一个Java项目的学习
1. java命令行的启动 首先是gradle build 其次是:java -Dabc.appid=1234 -classpath "a.jar:b.jar" com.ctri ...
- java编程控制电脑硬件_如何快速学习AP计算机中的Java编程?
AP Computer Science A (APCSA)考试,需要掌握Java编程语言.对于刚学习Java的同学,都应该了解Java编程语言的知识体系结构. 多编程零基础的高中生,在自学一段时间内, ...
- scheduledexecutorservice 只执行一次_一个ScheduledExecutorService启动的Java线程无故挂掉引发的思考...
2018年12月12日18:44:53 案件现场 不久前,在开发改造公司一个端到端监控日志系统的时候,出现了一个bug:有个扫表写日志的线程无故挂掉. 顺藤摸瓜 我看了很久的代码,都没有想出来有什么地 ...
最新文章
- 交换机端口隔离技术应用
- RMS 谈自由软件运动和后门
- 苹果企业证书_今日更新:丨企业证书已更新丨苹果丨安卓软件下载说明丨
- 模块的四种形式 模块的调用 循环导入问题 模块的搜索路径 py文件的两种用途 编译python文件 包...
- java怎么统计随机数出现次数,Excel统计出现次数、个数的VBA代码 java中怎么判断一个字符串中包含某个字符或字...
- python实用小方法
- 哈理工大学计算机专业宿舍,计算机学院举办“灯塔工程”之寝室文化节
- ALAssetsLibrary获取相册列表
- Python 开发者在迁移到 Go(lang) 时需要知道哪些事?
- XSS(跨站脚本攻击)攻击与防御
- HDU 5869.Different GCD Subarray Query-区间gcd+树状数组 (神奇的标记右移操作) (2016年ICPC大连网络赛)...
- Android源码-Logger日志系统
- 步步为营-53-JavaScript
- STM32-正弦波可调(50HZ~20KHZ可调、峰峰值0~3.3V可调)
- EUI组件之HScrollBar VScrollBar (动态设置滑块图片)
- iOS蚂蚁森林的loading效果
- 关于NB-IOT模块链接阿里物联网平台的学习笔记-记录
- ASO优化:影响 APP权重与吸量的五大要素
- 【POI1999】【BZOJ2936】降 水
- 计算机软著在线登记,计算机软件著作权登记收费标准
热门文章
- 霍兰德职业兴趣测试题
- 简述导线平差计算的五个步骤_RTK技术导线测量和全站仪导线测量有什么区别?...
- spark streaming python实例_kafka+spark streaming代码实例(pyspark+python)
- 从Element ui看开发公共组件的三种方式
- 2019央视春晚公布主持阵容 语言类节目将有突破
- Java:线程并发工具类
- 解决修改sources.list之后update NO_PUBKEY错误
- VMware workstation9 Virtual Machine Network
- 大数据体系【概念认知】系列-1:一致性 (未完)
- Cocoa编程开发者手册