2017-10-31 14 views
0

私は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("Test")。だから私はこのように配列をしたい

private String[] somearray = { decode("Test") }; 

私はどのようにそれを配列の各要素でコールデコードするのですか?

答えて

1

配列に格納する値をロードするたびにオペコードを挿入することができます。あなたが質問に投稿したコードを使用すると、デコードは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); 
} 
関連する問題