我需要帮助。例如,我有这样的课程。
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
?
答案 0 :(得分:0)
您必须了解how lambdas are compiled。分析类java.lang.Thread
的代码毫无意义,因为its documentation已经告诉你它将做什么,即它将调用所提供的run
实例的Runnable
方法,但该实例将由LambdaMetaFactory
在运行时创建。
但是您的类ThreadTest
包含最终将被调用的实际代码。它属于本课程的合成方法。当您遍历runThreads()
方法时,您将encounter invokedynamic
instructions。 bsmArgs
参数取决于invokedynamic
指令的实际引导方法,因此您必须查找its documentation以了解其含义。您将了解到它包含指向(合成)目标方法(在您的类中)的句柄。所以你知道那个方法包含最终由另一个线程执行的代码。
在您的情况下,您将遇到两条invokedynamic
指令,指向不同的合成方法,表示不同线程执行的不同代码。