0

我在钩子操作之后执行方法之前写过。

现在我想在我自己的界面中触发钩子方法。

我应该如何调用钩子方法

一个简短的示例代码会很好:)

谢谢

4

1 回答 1

0

简答

你需要调用java.lang.reflect.Method.invoke()

长答案

我假设您想调用(“调用”)您从代码的其他部分挂钩的方法。

首先,您需要访问要调用该函数的成员对象。

  1. 在您的beforeHookedMethod()afterHookedMethod()中,您会收到XC_MethodHook.MethodHookParam类型的对象
  2. 该对象具有Member类型的fields方法Object类型的thisObject。保存这些变量以备后用。
  3. 稍后,在您的界面中,当您要调用该函数时,只需将上面的 Member 转换为Method并以 thisObject 作为 Parameter调用Method.invoke() 。

代码示例-

//To save the returned Member and Object
public static Method myMember;
public static Object myObject;
.
.
.
//In your hook
protected Object beforeHookedMethod(MethodHookParam methodHookParam){
//Cast to method and save for later
    myMember = (Method) methodHookParam.method;
    myObject = methodHookParam.thisObject;
}
.
.
.
//Later, in your interface, to call the function
myMember.invoke(myObject)

注意- 如果您需要将参数传递给函数调用,您在 1 中获得的 MethodHookParam 对象也有args字段中的参数。

更容易 - 如果您要调用的函数是静态的

如果函数是静态的,则不需要等待回调。

  1. 您调用挂钩的函数(例如findAndHookMethod())返回XC_MethodHook.Unhook类型的对象作为参数。
  2. 在该对象上调用getHookedMethod()将返回Member类型的对象
  3. 只需将此成员转换为方法并调用 Method.invoke(null)(该对象可以为 null,因为该函数是静态的。)

注意- 另外,如果你仍然被那个方法所吸引,你的beforeHookedMethod()afterHookedMethod()在调用这个函数时仍然会被调用。如果您不想调用这些,请使用XposedBridge.invokeOriginalMethod()而不是上面的 Method.invoke()。

于 2017-03-23T16:37:55.377 回答