前几天MK开始弄JAVA,在群里讨论AOP的相关话题,我在搜索相关话题时看到wu_yanan2003兄06年写的一篇关于hookapi的文章《delphi下AOP技术( hookapi full source)
》。对于其中关于AOP的观点,我觉得有必要与他讨论一下。
首先是思想与实现技术的区别。
我在《用Delphi实现动态代理(2):设计说明
》一文里已经说过,AOP本身是一种思想,或者如维基百科定义
所
说,是一种程序设计范型。而像AspectJ、DynamicProxy、Mixin之类的则是实现AOP的具体技术。hook当然也可以用来作为实现
AOP的技术之一。但不能因此说哪个“是”AOP。就像我们不能说JAVA是OOP一样,JAVA只是一种OOPL,可以用来实现OOP,但就算是非
OOPL的C语言,也可以用来实现OOP。
其次是如何横切的问题。
不可否认,hook的功能很强大,可以实现函数级的精确切入,但是用它来实现AOP却未必是好技术。问题就在于它太过于底层,对切入动作的抽象不够,反而增加了程序员的工作量,达不到AOP横切所要达到的目标——为应用提供统一的横切处理实现。
具体来说就是:AOP不是要取代OOP,而是OOP的有益补充。其中OOP部分处理所谓的主关注点(通常即业务逻辑),AOP部分处理所谓的横切关注点。以维基百科中的例子来说:
对于一个信用卡应用程序来说,存款、取款、帐单管理是它的主关注点,日志和持久化将成为横切整个对象结构的横切关注点。
那么考虑一下用hook来实现日志功能的横切:
因
为hook技术需要对每个函数进行单独的切入,而且存款、取款、帐单三个函数的参数和返回值不论是类型还是参数个数都是不一样的,所以必须为三个函数分别
写三个代理函数,然后在这三个代理函数中去调用统一的日志处理。其优点是可以切入一般的函数,不限于OOP中的对象方法,但缺点与传统的template
method/static proxy
是一样的,都需要针对每个被切函数写代码。
而像AspectJ、DynamicProxy、Mixin之类则要方便得多。
以
DynamicProxy为例,它是基于OOP基础之上的,所以实际开发中可以先不考虑横切关注点的部分,只用OOP实现主关注点。然后通过
DynamicProxy为相应的对象切入统一的横切关注点实现——重点就在于这个横切实现不需要对每个成员函数作单独的横切,而是在一个统一的横切点
(如Interceptor)中进行。
所以,根本区别在于:hook需要一个个函数去切,而像DynamicProxy这样的技术则是一次切入对象的所有函数(当然也可以在代码中选择切入),甚至切入容器中的所有对象的所有函数。
分享到:
相关推荐
6. **AOP(面向切面编程)**:虽然Android原生并不支持AOP,但可以通过Hook技术模拟实现类似的功能,例如在应用启动时插入额外的逻辑代码。 7. **权限管理**:Hook AMS服务通常需要较高的系统权限,如`SYSTEM_ALERT...
dI.Hook - 使用 AOP 的轻量级 IoC 和 DI 引擎 dI.Hook(发音为 du'hʊk)是一个轻量级的 IoC 和 DI 引擎,通过代码或配置定义钩子,动态或有条件地调用它们,并在不需要时处理它们。 然而,这不是另一个依赖注入...
Java Hook 常用于AOP(面向切面编程)和测试框架中,如Spring AOP和JUnit。 Android Hook,则是针对Android系统特性的Hook技术,主要利用Android的System Server、Zygote进程以及JNI(Java Native Interface)等...
在Android开发中,Hook主要涉及到反射和AOP(面向切面编程)。例如,通过反射可以在运行时动态改变类的行为,而Xposed框架则提供了更强大的系统级Hook能力,允许开发者修改系统级别的行为,如拦截和修改系统事件,...
这对于插件系统、AOP(面向切面编程)或测试环境特别有用。 3. **Hook部分opcode**:PHP的源代码在执行前会被转换成中间表示——opcode。Hook部分opcode意味着扩展可以捕获并影响这些低级别的指令,这提供了非常...
【Lokie:使用C++和libffi的iOS高效AOP库】 Lokie是一款专为iOS平台设计的面向切面编程(Aspect-Oriented Programming,AOP)库,它利用C++和libffi来实现高效的运行时拦截和增强功能。AOP是一种编程范式,旨在通过...
通过下载并编译这些项目,你可以更深入地学习和实践Hook技术,并将其应用于你的项目中,例如进行AOP(面向切面编程)、性能调试或者安全控制等场景。 总之,Hook技术在Java开发中扮演着重要角色,它使开发者能够在...
**JVM-SANDBOX:基于JVM的实时无侵入AOP框架容器** JVM-SANDBOX是一个强大的工具,它允许开发者在Java虚拟机(JVM)上实现无侵入的面向切面编程(AOP)框架,提供实时监控和干预应用程序的能力。这个框架的核心在于...
Epic是一个在虚拟机层面、以Java Method为粒度的 运行时 AOP Hook框架。简单来说,Epic 就是ART上的 Dexposed 。它可以拦截本进程内部几乎任意的Java方法调用,可用于实现AOP编程、运行时插桩、性能分析、安全审计等...
此外,AspectD提供了一个莳萝转换器容器,开发人员可以在其之上实现自己的转换器,例如hook,json,mirror等。设计 假设您在hf_dir中有一个名为example的flutter项目。安装1.在hf_dir / example中创建一个名为...
Method Swizzling允许开发者在程序运行时修改类的方法实现,即改变原本selector与IMP(函数指针)的绑定关系。这种方法常用于AOP(面向切面编程),以便在不修改原有代码的情况下插入额外的功能或进行行为监控。 ...
该library基于ams的hook和aop封装登录逻辑,实现0重复代码登录 效果图 1。需要登录的功能分为2类. 一:进入需要登录后的页面(显然只支持主线程)。二:需要登录后操作的功能如点赞,弹出漂亮对话框等(支持多线程...
它在的内部与其他类似模块相同地使用对象。 它允许您在不创建新实例的情况下钩住类。 它使用javascript原型。 例如,我正在使用它向缺少所有调试代码的生产代码添加挂钩。 我没有访问实例的权限,但只有类构造函数...
在Android开发中,用户交互是应用的核心部分,而按钮点击事件是用户与应用进行互动的常见方式。然而,用户可能会因为误操作或者习惯性动作而快速连续点击按钮,导致不必要的功能执行或服务调用,这被称为重复点击...
本篇将深入探讨Python属性的实现,包括AOP(面向切面编程)、`property`修饰器、描述符机制以及属性的hook方法,同时也会提及实际应用中需要注意的事项。 首先,让我们了解什么是AOP。面向切面编程是一种编程范式,...
Dexposed的AOP完全是非侵入性的,无需任何注释处理器,编织器或字节码重写器。 集成就像在应用程序的初始化阶段仅用一行代码加载一个小的JNI库一样简单。 不仅可以挂钩您的应用程序代码,而且还可以挂钩在您的应用...
aop方式,直接引入项目。 hook以Model结尾的类的description方法,将原先不常用的内存地址log更改为遍历属性的log。 这个hook使用更安全的方式是加上项目前缀,具体操作请修改非常简单的源码。
目前,它支持Android 4.4与拇指-2 / arm64架构(仅ART)〜11.0。 关于它的工作原理,可以参考这篇中文。 注意:对于Android 6.0和32位模式,参数可能错误; 对于Android 9.0 +,pine将禁用隐藏的api限制策略。 ...
热修复通常依赖于Hook框架,这是一种在运行时修改应用程序行为的技术。 Hook框架在Android开发中广泛使用,主要是通过替换或拦截方法调用来改变原有的功能。美团可能使用了类似的技术来实现在应用运行过程中进行...