我想使用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。 我该怎么办?或任何其他方式可以做到这一点?
感谢您的帮助!谢谢。