Android-逆向分析ButterKnife框架

好了,言归正传。

这一篇文章,我们不谈ButterKnife的基本使用,只谈如何通过JavaSe的技术,思考并分析ButterKnife这一Android开发界内排行前十的注解框架。

唯物主义辩证法认为,世界上一切事物都是具有普遍的联系我们首先从ButterKnife的使用步骤开始,倒推分析该框架使用了什么样的技术,然后自己写一个简单的ButterKnife小框架。

在正式写这篇博客之前,需要对反射以及注解(JavaSe技术)有一个初步的认识,就算不了解的也没有关系,笔者也提供了两篇博客供大家学习参考,点击这里了解反射点击这里了解注解 ,(这两篇也是笔者一字一字码出来的,望各位大兄弟不吝star)只需要花个十多分钟认真细心的看,反射和注解都不是很大的问题。接下来的东西还是很需要这两篇博客中使用到的基础。

说起ButterKnife(黄油刀),大家肯定会想到,哇,这个是用来简化findViewById以及快速实现点击事件等等一个深受大家好评的框架、没错,下图就是大家熟悉的写法


butterKnife常用写法

熟悉注解的同学,可能一眼就看出,咦,这个@BindView以及@OnClick不就是两个注解吗?没错,的确是,而且,这个注解的类型是int值,因为里面是具体的View ID。了解这种情况后,就有了如下代码:首先,我们先写找控件的注解


自定义控件注解

步骤1:

在使用ButterKnife注解之前,我们需要bind(Activty),

所以,我们就按照那种写法,先声明一个ButterKnife类,里面有个bind方法,参数是Activty

步骤2:

A:既然从外部传入了这个Activity,那么,我们就可以通过暴力反射获取该Activity上所有的成员变量,这里返回的是字段数组,

B:(因为是数组,所以需通过迭代器遍历获取每一个字段) 拿到成员变量之后,继续通过暴力反射其变量上的自定义注解  就  可以获取注解上的值(核心逻辑)

C:接着,我们既然通过B步骤已经获取到注解上的值(也就是控件的ID),那么就可以通过findViewByid去获取具体的View控件

D:最后,在通过反射将C步骤获取到的控件, 将其控件赋值给变量


步骤1


步骤2:模仿bindView逻辑


最后,为了测试这种写法能否达到预期的效果,我写了一个Demo,经测试,效果如图:


测试用到的Xml
没有findViewById依旧可以获取到属性值

经测试,myTextViewOne,myTextViewTwo这两个控件,我没有findViewById, 依旧可以获取到TextView上的值,所以,这个小功能经测试是可行的,

类似的,还有一个自定义注解点击事件,

依旧可以按照上面的写法,先写一个OnClick的自定义注解,如下图


自定义点击事件注解

这里需要注意的是,

我们的点击事件的逻辑,是写在方法上的,所以,需要定义注解的使用范围是在方法上 也就是 @Target(ElementType.METHOD)

接下来的步骤,和上面的bindview 步骤差不多,

(暴力反射---获取注解的值----通过该值找到控件---对控件进行点击监听---反射调用使用了注解的方法),

这里直接上图


自定义点击注解

接下来,我们写代码测试该注解:


测试点击注解

经测试,这个功能是完全可以使用的,

这样,一个简单而不简约的迷你型ButterKnife框架就写好了。

最后总结:

1:自定义注解绑定的是具体的控件,也就是int值,根据自定义注解去定义这个int属性值

2:在使用了该自定义注解后的控件,通过暴力反射获取字段在根据其字段拿到具体的注解属性值

3:根据拿到具体的属性值,在做进一步的操作

4:当然,要是做到真正的ButterKnife框架还是有一些差距。但是我们这里只做简单的技术分析

最后,千里之行、始于足下,加油!

源码,(直接看图就可以了吧)附github地址

项目地址

如果这篇文章对您有开发or学习上的些许帮助,希望各位看官留下宝贵的star,谢谢。

Ps:著作权归作者所有,转载请注明作者, 商业转载请联系作者获得授权,非商业转载请注明出处(开头或结尾请添加转载出处,添加原文url地址),文章请勿滥用,也希望大家尊重笔者的劳动成果,谢谢。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,434评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • 前言:ButterKnife是一个专注于Android系统的View注入框架,以前总是要写很多findViewBy...
    Donkor阅读 10,179评论 3 23
  • 哀公問於孔子曰:「寡人欲論魯國之士,與之為治,敢問如何取之?」孔子對曰:「生今之世,志古之道,居今之俗,服古之服,...
    百无一用知止阅读 268评论 0 1
  • 最近有朋友得了胆结石,看着他疼的连走路都困难,据他描述绞痛的想死的心都有了,而患胆结石的原因是十多年不吃早餐...
    彤话Ashley阅读 331评论 0 1