Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用ASM为数组中的每个字符串调用函数_Java_Bytecode - Fatal编程技术网

Java 如何使用ASM为数组中的每个字符串调用函数

Java 如何使用ASM为数组中的每个字符串调用函数,java,bytecode,Java,Bytecode,因此,我试图使用ASM构建一个字符串数组,但是我想为数组中的每个字符串调用一个函数。我不知道该怎么做,已经在互联网上搜索了一段时间了。这是我迄今为止构建阵列所获得的: InstructionAdapter builder = new InstructionAdapter(mv); builder.iconst(strings.length); builder.newarray(Type.getType(String.class)); for (int i = 0; i < strings.

因此,我试图使用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;");
现在我要做的是对数组中的每个字符串调用一个函数,假设我有一个名为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);
}
for(int i=0;i
当然,只有当您希望decode()调用在运行时发生时,才需要这样做。由于这里只处理常量字符串,所以可能需要考虑只在编译时执行解码调用,而只将结果写入转换后的类文件。在这种情况下,您编写的代码将与下面的内容类似

for (int i = 0; i < strings.length; i++) {
    builder.dup();
    builder.iconst(i);
    builder.aconst(decode(strings[i]));
    builder.astore(InstructionAdapter.OBJECT_TYPE);
}
for(int i=0;i
for (int i = 0; i < strings.length; i++) {
    builder.dup();
    builder.iconst(i);
    builder.aconst(decode(strings[i]));
    builder.astore(InstructionAdapter.OBJECT_TYPE);
}