程序猿口中的hook是什么意思?

本文介绍了iOS中Aspect框架的使用方法,该框架利用runtime特性实现了面向切面编程,允许在类或实例方法调用前后插入自定义代码,增强代码功能。通过hook技术,开发者可以在不修改原有代码的情况下,对特定方法进行拦截和扩展。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址:https://www.jianshu.com/p/0eeb3885b2e1

iOS里有一个非常的好用切面编程的框架<Aspect>,功能我简要概括下,基于runtime 中的黑魔法实现,一共提供了两个AOP方法,可以对某一个类或者实例的方法进行拦截然后各种xxoo。

/// Adds a block of code before/instead/after the current `selector` for a specific class.
+ (id<AspectToken>)aspect_hookSelector:(SEL)selector
                      withOptions:(AspectOptions)options
                       usingBlock:(id)block
                            error:(NSError **)error;

/// Adds a block of code before/instead/after the current `selector` for a specific instance.
- (id<AspectToken>)aspect_hookSelector:(SEL)selector
                      withOptions:(AspectOptions)options
                       usingBlock:(id)block
                            error:(NSError **)error;

然而在阅读他的源码从网上查阅资料时经常会遇到hook这个词,感觉挺有意思,百度翻译了一下是钩子的意思,当你如果还是一名学生的时候,word天呐,对说了这个词语的人真是崇拜至极,心里默念着牛逼,其实这是一名程序员应该懂的基本功.
其实钩子来源于英文词Hook,在windows系统中,一切皆消息,比如按了一下键盘,也是一个消息,Hook的意思是勾住,也就是在消息过去之前,可以先把消息勾住,不让其传递,你可以优先处理,也即这项技术就是提供了一个入口,能够针对不同的消息或者API在执行前,先执行你的操作,你的操作也称为「钩子函数」,所以,有的时候程序员在讨论的时候,也经常会说,可以先hook住,在处理,也即在执行某某操作之前,优先处理一下
好啦,这就是Hook的思想和原理,希望以后在和猿交流的过程中,听到这个词的时候,你能够自信的对程序员点点头,祝装逼成功哦~

### hook在编程或软件开发中的定义和用法 #### 1. Hook 的基本概念 Hook 是一种常见的编程术语,在不同的上下文中可能具有略微不同的意义,但其核心思想始终围绕着拦截、扩展或修改某些行为的功能。它允许开发者通过某种方式介入系统的运行流程,从而改变默认的行为或者注入自定义逻辑。 在 C++ 软件调试技术中,掌握 Hook 技术可以帮助开发者更好地理解程序内部的工作机制,并能够动态调整应用程序的状态[^1]。而在前端 Vue.js 开发领域,钩子方法(hook method)则提供了一种优雅的方式来管理组件生命周期的不同阶段,使代码更模块化和易于维护[^2]。 对于 Android 插件化开发而言,Hook 更加具体地表现为对系统框架层面上的关键对象进行重定向操作的能力。例如通过对 ActivityManagerService 或 Instrumentation 类的成员函数实施替换处理来达到加载外部 APK 文件的目的[^3]。 另外,在一些高级场景下比如基于 Xposed 框架的应用改造工作中,“原理”部分也提到了如何利用 Java Reflection 和代理模式完成 runtime 层面的方法挂钩工作。这种类型的 Hook 不仅限于 Android 平台本身,还可以广泛应用于桌面端甚至服务器端环境下的功能增强需求之中[^4]。 综上所述,无论是在哪一类 IT 领域当中讨论到 Hook ,它们都共同指向了一个目标 —— 即赋予程序员更大的灵活性去控制原本不可见或者难以触及的部分。 #### 2. 使用案例分析 以下是几个典型例子展示了 Hook 如何被实际运用: - **JavaScript 中的回调函数** ```javascript var a = 0; function bb(x) { console.log(x); } function timer(time, callback) { setTimeout(() => { a = 6; callback(a); // 当定时器到期时触发此回调函数 }, time); } console.log(a); // 输出初始值 '0' timer(3000, bb); // 经过三秒后打印更新后的变量'a'即数值‘6’ ``` 在这个 JavaScript 实现里,`timer()` 函数接受两个参数:一个是延迟时间 `time`;另一个则是待执行完毕之后要调用回来的匿名函数指针形式表示出来的动作描述符——也就是我们所说的 “callback”。这正是最简单直观的一种 Hook 表达样式之一[^2]。 - **Xposed Framework 下的 Method Hook** 假设我们需要监控某个应用每次启动新 activity 的过程,则可以通过编写如下所示的一个简易版 Module 来达成目的: ```java public class MyModule implements IXposedHookLoadPackage { @Override public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable { if (!lpparam.packageName.equals("com.example.targetapp")) return; findAndHookMethod(Activity.class.getName(), lpparam.classLoader, "onCreate", Bundle.class, new XC_MethodHook() { protected void beforeHookedMethod(MethodHookParam param) throws Throwable { Log.d("MyModule", String.format( "%s.onCreate called with bundle %s", ((Activity)(param.thisObject)).getClass().getSimpleName(), (Bundle)param.args[0])); } }); } } ``` 这里借助了反射手段获取目标类实例及其公开接口列表,并进一步绑定至指定位置处设置监听点以便实时捕获感兴趣的数据流变化情况[^4]。 --- 问题
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值