一个快速生成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的插件相关推荐

  1. java treelist 排序_一个很好的Java排序列表

    我正在寻找Java的良好排序列表.到处搜寻可以给我一些有关使用TreeSet / TreeMap的提示.但是这些组件缺少一件事:随机访问集合中的元素.例如,我想访问排序集中的第n个元素,但是使用Tre ...

  2. java 判断类型_如何快速入门Java编程学习(干货)

    一.初识Java 1.生活中的程序: 从起床到教室上课的过程 穿衣打扮>起床>洗漱>出宿舍>>吃早餐>到教室 按照特定的顺序去完成某一件事的过程我们叫做生活中的程序 ...

  3. JAVA利用google的zxing快速生成QRCode

    利用google的zxing快速生成QRCode 1.导入jar包,如果是非maven工程就去mvnrepository.com搜索zxing,下载本jar包即可 <dependency> ...

  4. 零基础学java web开发_从零基础学Java成为一个专业的java web 开发者

    原标题:从零基础学Java成为一个专业的java web 开发者 "我怎么才能成为一个Java Web开发者?"对于这个问题,答案其实并不简单.成为一个Java Web开发人员包括 ...

  5. java鉴权_一个开箱即用的高效认证鉴权框架,专注于restful api的认证鉴权动态保护...

    作者:tomsun28 来源:SegmentFault 思否 写在开头 看了看这个专栏的最近一篇文章已经是两年前了,时间过得好快.应该是出学校后时间就很快了.两年前因为用shiro后,自己就按着想法开 ...

  6. java不规则算法_分布式id生成算法 snowflake 详解

    背景 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识.如在支付流水号.订单号等,随者业务数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数据库的自增ID显然不能满足需 ...

  7. java项目学习_一个Java项目的学习

    1. java命令行的启动 首先是gradle build 其次是:java -Dabc.appid=1234 -classpath "a.jar:b.jar"  com.ctri ...

  8. java编程控制电脑硬件_如何快速学习AP计算机中的Java编程?

    AP Computer Science A (APCSA)考试,需要掌握Java编程语言.对于刚学习Java的同学,都应该了解Java编程语言的知识体系结构. 多编程零基础的高中生,在自学一段时间内, ...

  9. scheduledexecutorservice 只执行一次_一个ScheduledExecutorService启动的Java线程无故挂掉引发的思考...

    2018年12月12日18:44:53 案件现场 不久前,在开发改造公司一个端到端监控日志系统的时候,出现了一个bug:有个扫表写日志的线程无故挂掉. 顺藤摸瓜 我看了很久的代码,都没有想出来有什么地 ...

最新文章

  1. 交换机端口隔离技术应用
  2. RMS 谈自由软件运动和后门
  3. 苹果企业证书_今日更新:丨企业证书已更新丨苹果丨安卓软件下载说明丨
  4. 模块的四种形式 模块的调用 循环导入问题 模块的搜索路径 py文件的两种用途 编译python文件 包...
  5. java怎么统计随机数出现次数,Excel统计出现次数、个数的VBA代码 java中怎么判断一个字符串中包含某个字符或字...
  6. python实用小方法
  7. 哈理工大学计算机专业宿舍,计算机学院举办“灯塔工程”之寝室文化节
  8. ALAssetsLibrary获取相册列表
  9. Python 开发者在迁移到 Go(lang) 时需要知道哪些事?
  10. XSS(跨站脚本攻击)攻击与防御
  11. HDU 5869.Different GCD Subarray Query-区间gcd+树状数组 (神奇的标记右移操作) (2016年ICPC大连网络赛)...
  12. Android源码-Logger日志系统
  13. 步步为营-53-JavaScript
  14. STM32-正弦波可调(50HZ~20KHZ可调、峰峰值0~3.3V可调)
  15. EUI组件之HScrollBar VScrollBar (动态设置滑块图片)
  16. iOS蚂蚁森林的loading效果
  17. 关于NB-IOT模块链接阿里物联网平台的学习笔记-记录
  18. ASO优化:影响 APP权重与吸量的五大要素
  19. 【POI1999】【BZOJ2936】降 水
  20. 计算机软著在线登记,计算机软件著作权登记收费标准

热门文章

  1. 霍兰德职业兴趣测试题
  2. 简述导线平差计算的五个步骤_RTK技术导线测量和全站仪导线测量有什么区别?...
  3. spark streaming python实例_kafka+spark streaming代码实例(pyspark+python)
  4. 从Element ui看开发公共组件的三种方式
  5. 2019央视春晚公布主持阵容 语言类节目将有突破
  6. Java:线程并发工具类
  7. 解决修改sources.list之后update NO_PUBKEY错误
  8. VMware workstation9 Virtual Machine Network
  9. 大数据体系【概念认知】系列-1:一致性 (未完)
  10. Cocoa编程开发者手册