跳到主要内容

hook

简介

外部函数调用

  • 通过注册钩子函数的方式来实现外部方法的传参调用
  • 该方法来源于之前老版本common-lib中的HookD

使用场景

  • hook是一个parallel的全局钩子函数,支持在任意场景进行注册和调用
  • common_event则是绑定在一个object上进行监听和触发
  • common_event支持同步获取方法结果,而hook不支持
  • hook和common_event两者都支持同一个调用触发多个函数执行

使用方法

  • import pkg.hook;
  • 调用 hook.register(string hook_name, string hooker, function func, bool add_last = true); 注册需要外部调用的钩子函数
  • 调用 hook.async_blocking_invoke(string hook_name ...); 异步阻塞调用指定钩子函数
  • 调用 hook.invoke(string hook_name ...); 无条件调用指定钩子函数
  • 调用 hook.invoke_break(string hook_name ...); 调用指定钩子函数,如遇到异常则中断处理

例子:

#pragma parallel

import gs.lang.*;
import gs.util.*;
import pkg.gtest;

import pkg.hook;

void create()
{
hook.register("hooktest", "tester", (: hook_test :));
}

public mixed hook_test(int p1, string p2)
{
printf("This is hook test param1:%d, param2:%s", p1, p2);
return [p1, p2];
}

public mixed hook_invoke(int p1, string p2)
{
return hook.invoke_break("hooktest", p1, p2);
}

public void test_run()
{
gtest.test_func((: hook_invoke, 1, "test" :), [1, "test"]);
}

组件接口

函数原型函数作用
void register(string hook_name, string hooker, function func, bool add_last = true)该接口用来注册外部调用函数
void async_blocking_invoke(string hook_name ...)该接口用来异步阻塞调用指定钩子函数
void invoke(string hook_name ...)该接口用来无条件调用指定钩子函数
mixed invoke_break(string hook_name ...)该接口用来调用指定钩子函数,如遇到异常则中断处理