如何使用ASM修改InvokeDynamic LambdaMetaFactory

时间:2019-06-21 03:36:02

标签: bytecode java-bytecode-asm

我想使用ASM修改类文件的invokedynamic指令,使invokedynamic指令指南成为自定义方法。

我尝试覆盖visitInvokeDynamicInsn方法,并尝试更改将传递给Handle bsm的{​​{1}}和Object... bsmArgs。遵循是我的代码。

首先是我的源代码:

super.visitInvokeDynamicInsn

现在,我想使用方法public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.button).setOnClickListener(System.out::println); } public static void testsss(PrintStream ps, View view){ System.out.println("sdsdfsdfsdf"); } } 来代替testsss。结果可能像这样:

System.out::println

我的ASM代码是这样的:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                System.out.println(v);
                testsss(System.out, v);
            }
        });
    }

    public static void testsss(PrintStream ps, View view){
        System.out.println("sdsdfsdfsdf");
    }
}

现在,通过这种方式我遇到了很多问题,我不仅应该替换BSM及其参数,还应该更改与BSM相关的constant_pool。 我该怎么办?或任何其他方式可以做到这一点?

感谢您的帮助!谢谢。

0 个答案:

没有答案