如何使用ASM获取在另一个线程中执行的代码?

时间:2015-02-21 13:20:52

标签: java multithreading bytecode

我需要帮助。例如,我有这样的课程。

public class ThreadTest {
    public void runThreads() {
        Thread t1 = new Thread(() -> {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            int i = 1;
            System.out.println("Thread " + i);
        });

        Thread t2 = new Thread(() -> {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            int i = 2;
            System.out.println("Thread " + i);
        });
        t1.start();
        t2.start();
    }
}

我为ThreadTest运行classVisitor。我想得到在第一和第二个线程中执行的字节码。有没有办法做到这一点?我想我应该访问课程Thread,然后访问其中的方法run。但是我如何从ThreadTest

执行此操作

1 个答案:

答案 0 :(得分:0)

您必须了解how lambdas are compiled。分析类java.lang.Thread的代码毫无意义,因为its documentation已经告诉你它将做什么,即它将调用所提供的run实例的Runnable方法,但该实例将由LambdaMetaFactory在运行时创建。

但是您的类ThreadTest包含最终将被调用的实际代码。它属于本课程的合成方法。当您遍历runThreads()方法时,您将encounter invokedynamic instructionsbsmArgs参数取决于invokedynamic指令的实际引导方法,因此您必须查找its documentation以了解其含义。您将了解到它包含指向(合成)目标方法(在您的类中)的句柄。所以你知道那个方法包含最终由另一个线程执行的代码。

在您的情况下,您将遇到两条invokedynamic指令,指向不同的合成方法,表示不同线程执行的不同代码。