如何使用 ASM 为数组中的每个字符串调用一个函数
How to call a function for each String in an array using ASM
所以我正在尝试使用 ASM 构建一个字符串数组,但是我想为数组中的每个字符串调用一个函数。我不知道该怎么做,现在已经在互联网上搜索了一段时间。这是我到目前为止构建数组的结果:
InstructionAdapter builder = new InstructionAdapter(mv);
builder.iconst(strings.length);
builder.newarray(Type.getType(String.class));
for (int i = 0; i < strings.length; i++) {
builder.dup();
builder.iconst(i);
builder.aconst(strings[i]);
builder.astore(InstructionAdapter.OBJECT_TYPE);
}
builder.putstatic(callOwner.name, FIELD_NAME, "[Ljava/lang/String;");
如您所见,我有一个字符串数组,称为 strings
,我对其进行迭代并构建数组。
这会生成一个可能如下所示的数组
private String[] somearray = { "Test" };
现在我想做的是对数组中的每个字符串调用一个函数,假设我有一个名为 decode 的函数,我会这样调用它 decode("Test")
。所以我希望数组看起来像这样
private String[] somearray = { decode("Test") };
如何让它对数组中的每个元素调用解码?
只要加载要存储在数组中的值,就可以插入操作码。使用您在问题中发布的代码,它应该看起来像这样,假设 decode 是 MyClass
.
中定义的静态方法
for (int i = 0; i < strings.length; i++) {
builder.dup();
builder.iconst(i);
builder.aconst(strings[i]);
builder.invokestatic("LMyClass;", "decode", "(Ljava/lang/String;)Ljava/lang/String;", false);
builder.astore(InstructionAdapter.OBJECT_TYPE);
}
当然,只有当您希望 decode() 调用在运行时发生时才会这样。由于您在这里只处理常量字符串,您可能想考虑只在翻译时进行解码调用,并且只将结果写入转换后的类文件。在那种情况下,您的代码看起来应该与此类似。
for (int i = 0; i < strings.length; i++) {
builder.dup();
builder.iconst(i);
builder.aconst(decode(strings[i]));
builder.astore(InstructionAdapter.OBJECT_TYPE);
}
所以我正在尝试使用 ASM 构建一个字符串数组,但是我想为数组中的每个字符串调用一个函数。我不知道该怎么做,现在已经在互联网上搜索了一段时间。这是我到目前为止构建数组的结果:
InstructionAdapter builder = new InstructionAdapter(mv);
builder.iconst(strings.length);
builder.newarray(Type.getType(String.class));
for (int i = 0; i < strings.length; i++) {
builder.dup();
builder.iconst(i);
builder.aconst(strings[i]);
builder.astore(InstructionAdapter.OBJECT_TYPE);
}
builder.putstatic(callOwner.name, FIELD_NAME, "[Ljava/lang/String;");
如您所见,我有一个字符串数组,称为 strings
,我对其进行迭代并构建数组。
这会生成一个可能如下所示的数组
private String[] somearray = { "Test" };
现在我想做的是对数组中的每个字符串调用一个函数,假设我有一个名为 decode 的函数,我会这样调用它 decode("Test")
。所以我希望数组看起来像这样
private String[] somearray = { decode("Test") };
如何让它对数组中的每个元素调用解码?
只要加载要存储在数组中的值,就可以插入操作码。使用您在问题中发布的代码,它应该看起来像这样,假设 decode 是 MyClass
.
for (int i = 0; i < strings.length; i++) {
builder.dup();
builder.iconst(i);
builder.aconst(strings[i]);
builder.invokestatic("LMyClass;", "decode", "(Ljava/lang/String;)Ljava/lang/String;", false);
builder.astore(InstructionAdapter.OBJECT_TYPE);
}
当然,只有当您希望 decode() 调用在运行时发生时才会这样。由于您在这里只处理常量字符串,您可能想考虑只在翻译时进行解码调用,并且只将结果写入转换后的类文件。在那种情况下,您的代码看起来应该与此类似。
for (int i = 0; i < strings.length; i++) {
builder.dup();
builder.iconst(i);
builder.aconst(decode(strings[i]));
builder.astore(InstructionAdapter.OBJECT_TYPE);
}