Featured image of post Hook

Hook

hook随记

此文目前为摘录他人

hook(钩子)是一种编程机制,在操作系统、编程里也会用到。

hook的作用是让程序能够在特定事件发生时插入自定义代码,或者对系统行为进行拦截和修改。它是一种软件设计模式,借助预留接口,实现对系统或框架原有流程的扩展与增强。

Java中有一种机制,叫做动态代理(Dynamic Proxy),它可以被视为一种特殊的运行时钩子(Runtime Hook),因为它允许你在不修改原有代码的情况下,拦截并增强对象方法的调用。

在编程中,Hook(钩子)的本质是一种 “程序拦截机制”,它允许你在不修改原始代码的前提下,介入并改变程序的执行流程。这种机制通过注入自定义逻辑到现有系统的特定点来实现增强或修改功能的目的。

以JavaScript为例, 源代码

1
2
3
4
5
6
function add(a,b){
    return a + b
}

res = add(1,3)
console.log("结果: " + res)

结果显而易见,是4.

但是,我们想在不改变调用的情况下,在执行add方法时,在其前面打印”add方法执行“,结束时打印”add方法结束“,并让返回的结果+1。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
function add(a, b) {
    return a + b;
}

const hook = {
    originalAdd: add // 立即保存引用
};

// 重新定义add函数
add = function(a, b) {
    console.log("add方法调用前");
    let res = hook.originalAdd(a, b);
    console.log("add方法调用后");
    return res + 1;
};

let res = add(1, 3);
console.log("结果: " + res); // 输出5

结果如图:

813f7075c381ea8d32bcb7d79f3dd430.png

调用的代码并未变化,但是结果发声改变了。 上述的案例就是一个hook的过程。 它先将原函数对象的引用(即内存地址)保存起来,然后在新函数中调用原add函数,最后令add指向一个新函数。

Licensed under CC BY-NC-SA 4.0
前途似海,来日方长。

<