Как использовать ASM для изменения InvokeDynamic LambdaMetaFactory - PullRequest
0 голосов
/ 21 июня 2019

Я хочу использовать 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.Как мне это сделать?Или любые другие способы сделать это?

Любая помощь приветствуется!Спасибо.

...