Android-逆向分析ButterKnife框架

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

好了,言归正传。

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

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

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

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


img_6bb72e56c0c909f6f7e8d1f77458b70d.png
butterKnife常用写法

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


img_5cf46b2bfe40cc12fb51a09aca0b97c1.png
自定义控件注解

步骤1:

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

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

步骤2:

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

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

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

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


img_d044757115300e28026dda377c32fb63.png
步骤1


img_814d4a9a311fb046272f417772c5fbaf.png
步骤2:模仿bindView逻辑


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


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

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

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

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


img_13b01ceceaff0e9db69f09f9a62707cb.png
自定义点击事件注解

这里需要注意的是,

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

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

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

这里直接上图


img_4a3cea69085aae40070b941bd30f008f.png
自定义点击注解

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


img_c97bb8f8cbbd1b19f4974ff954171559.png
测试点击注解

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

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

最后总结:

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

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

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

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

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

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

项目地址

    如果这篇文章对你有帮助,希望各位看官留下宝贵的star,谢谢。

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

相关文章
|
27天前
|
开发工具 Android开发 Swift
安卓与iOS开发环境对比分析
在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统无疑是主角。它们各自拥有独特的特点和优势,为开发者提供了不同的开发环境和工具。本文将深入浅出地探讨安卓和iOS开发环境的主要差异,包括开发工具、编程语言、用户界面设计、性能优化以及市场覆盖等方面,旨在帮助初学者更好地理解两大平台的开发特点,并为他们选择合适的开发路径提供参考。通过比较分析,我们将揭示不同环境下的开发实践,以及如何根据项目需求和目标受众来选择最合适的开发平台。
34 2
|
2月前
|
物联网 区块链 vr&ar
未来已来:探索区块链、物联网与虚拟现实技术的融合与应用安卓与iOS开发中的跨平台框架选择
【8月更文挑战第30天】在科技的巨轮下,新技术不断涌现,引领着社会进步。本文将聚焦于当前最前沿的技术——区块链、物联网和虚拟现实,探讨它们各自的发展趋势及其在未来可能的应用场景。我们将从这些技术的基本定义出发,逐步深入到它们的相互作用和集成应用,最后展望它们如何共同塑造一个全新的数字生态系统。
|
9天前
|
安全 Android开发 数据安全/隐私保护
探索安卓与iOS的安全性差异:技术深度分析与实践建议
本文旨在深入探讨并比较Android和iOS两大移动操作系统在安全性方面的不同之处。通过详细的技术分析,揭示两者在架构设计、权限管理、应用生态及更新机制等方面的安全特性。同时,针对这些差异提出针对性的实践建议,旨在为开发者和用户提供增强移动设备安全性的参考。
|
16天前
|
安全 Linux Android开发
探索安卓与iOS的安全性差异:技术深度分析
本文深入探讨了安卓(Android)和iOS两个主流操作系统平台在安全性方面的不同之处。通过比较它们在架构设计、系统更新机制、应用程序生态和隐私保护策略等方面的差异,揭示了每个平台独特的安全优势及潜在风险。此外,文章还讨论了用户在使用这些设备时可以采取的一些最佳实践,以增强个人数据的安全。
|
17天前
|
前端开发 Java 数据库
💡Android开发者必看!掌握这5大框架,轻松打造爆款应用不是梦!🏆
在Android开发领域,框架犹如指路明灯,助力开发者加速应用开发并提升品质。本文将介绍五大必备框架:Retrofit简化网络请求,Room优化数据库访问,MVVM架构提高代码可维护性,Dagger 2管理依赖注入,Jetpack Compose革新UI开发。掌握这些框架,助你在竞争激烈的市场中脱颖而出,打造爆款应用。
86 3
|
25天前
|
编译器 Android开发 开发者
带你了解Android Jetpack库中的依赖注入框架:Hilt
本文介绍了Hilt,这是Google为Android开发的依赖注入框架,基于Dagger构建,旨在简化依赖注入过程。Hilt通过自动化的组件和注解减少了DI的样板代码,提高了应用的可测试性和可维护性。文章详细讲解了Hilt的主要概念、基本用法及原理,帮助开发者更好地理解和应用Hilt。
40 8
|
1月前
|
IDE 开发工具 Android开发
安卓与iOS开发环境对比分析
本文将探讨安卓和iOS这两大移动操作系统在开发环境上的差异,从工具、语言、框架到生态系统等多个角度进行比较。我们将深入了解各自的优势和劣势,并尝试为开发者提供一些实用的建议,以帮助他们根据自己的需求选择最适合的开发平台。
29 1
|
2月前
|
Java 开发工具 Android开发
安卓与iOS开发环境对比分析
【8月更文挑战第20天】在移动应用开发的广阔天地中,Android和iOS两大平台各自占据着重要的位置。本文将深入探讨这两种操作系统的开发环境,从编程语言到开发工具,从用户界面设计到性能优化,以及市场趋势对开发者选择的影响。我们旨在为读者提供一个全面的比较视角,帮助理解不同平台的优势与挑战,并为那些站在选择十字路口的开发者提供有价值的参考信息。
|
2月前
|
设计模式 Java Android开发
探索安卓应用开发:从新手到专家的旅程探索iOS开发中的SwiftUI框架
【8月更文挑战第29天】本文旨在通过一个易于理解的旅程比喻,带领读者深入探讨安卓应用开发的各个方面。我们将从基础概念入手,逐步过渡到高级技术,最后讨论如何维护和推广你的应用。无论你是编程新手还是有经验的开发者,这篇文章都将为你提供有价值的见解和实用的代码示例。让我们一起开始这段激动人心的旅程吧!
|
2月前
|
Android开发
基于Amlogic 安卓9.0, 驱动简说(三):使用misc框架,让驱动更简单
如何使用Amlogic T972安卓9.0系统上的misc框架来简化驱动程序开发,通过misc框架自动分配设备号并创建设备文件,从而减少代码量并避免设备号冲突。
25 0
基于Amlogic 安卓9.0, 驱动简说(三):使用misc框架,让驱动更简单
下一篇
无影云桌面