Я хочу использовать ASM для изменения инструкции invokedynamic
файла класса, сделать руководство по инструкции invokedynamic
для пользовательского метода.
Я попытался переопределить метод visitInvokeDynamicInsn
и попытался изменить Handle bsm
и 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
.Результат может выглядеть следующим образом:
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");
}
}
И мой код ASM выглядит следующим образом:
@Override
void visitInvokeDynamicInsn(String name1, String desc1, Handle bsm, Object... bsmArgs) {
Handle handle2 = new Handle(6,"com/curious/autotrack/demo/MainActivity","testsss","(Ljava/lang/PrintStream;Landroid/view/View;)V")
bsmArgs[1] = handle2
super.visitInvokeDynamicInsn(name1, '(Ljava/lang/PrintStream;)Landroid/view/View$OnClickListener;', bsm, bsmArgs)
}
Теперь я столкнулся с множеством проблем, поэтому я не должен просто заменятьBSM и его аргументы, также я должен изменить константу constant_pool с BSM.Как мне это сделать?Или любые другие способы сделать это?
Любая помощь приветствуется!Спасибо.