使用 ArrayList<MyObject> 参数的挂钩方法

Hooking method with ArrayList<MyObject> parameter

我有一个 class MyObject 和一个主要 activity 实现方法 test(ArrayList<MyObject> x)

的应用程序
    public class MyObject {

    private String x;

    MyObject(String x) {
        this.x = x;
    }

    public String getX() {
        return x;
    }
}

现在我需要将方法 test 与 xposed 挂钩以获取参数 x。我如何访问和遍历 ArrayList 并调用 getX 方法?我的第一种方法是将其作为参数传递给 findAndHookMethod 方法:

final Class<?> myObject = XposedHelpers.findClass(
    "com.xposed.packagehook.MyObject", lpparam.classLoader);`

但我不知道如何将其包装到 ArrayList 中。

开发挂钩时,使用应用程序源代码作为基础并不是一个好主意。推荐使用编译好的apk文件,使用apktool之类的工具进行反编译。这样做的原因是编译后的代码有时看起来与您期望的有点不同:

方法参数定义ArrayList<MyObject>包含两部分:

  1. 对象类型ArrayList
  2. 一个(泛型)类型参数MyObject

泛型不是原始 Java 定义的一部分,后来添加此概念时,它仅限于编译器。因此,泛型类型参数仅在编译时存在于方法签名中。在应用程序 dex 字节代码和运行时,您只会看到这样的方法测试:

void test(ArrayList x)

或在 Smali 代码中与 apktool 输出的相同:

method public test(Ljava/util/ArrayList;)V

一些反编译器也可能显示泛型类型参数,但该信息来自注释,该注释不是挂钩方法所需的方法签名的一部分。

因此,如果你想挂钩这个方法,MyObject 是完全不相关的。只需挂钩具有 java.util.ArrayList 参数的测试方法即可。