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

时间:2020-06-13 01:09:47

标签: java android xposed

我有一个类data_frame["FirstName"] = data_frame["SplitName"].str[0] if data_frame["Length"].eq(2) else "" 和一个应用,该应用的主要活动实现了方法MyObject

test(ArrayList<MyObject> x)

现在,我需要使用xposed钩住方法 public class MyObject { private String x; MyObject(String x) { this.x = x; } public String getX() { return x; } } 以获取参数test。我如何访问和遍历ArrayList并调用x方法?我的第一种方法是将其作为getX方法的参数传递:

findAndHookMethod

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

1 个答案:

答案 0 :(得分:1)

在开发钩子时,使用应用程序源代码作为基础不是一个好主意。建议使用已编译的APK文件,并使用apktool之类的工具对其进行反编译。原因是编译后的代码有时看起来与您期望的有所不同:

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

  1. 对象类型ArrayList
  2. (通用)类型参数MyObject

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

void test(ArrayList x)

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

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

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

因此,如果要挂钩此方法,则MyObject完全不相关。只需挂接带有java.util.ArrayList参数的测试方法就可以了。