Java 如何使用ASM获取在另一个线程中执行的代码?
我需要帮助。比如我有这样的课Java 如何使用ASM获取在另一个线程中执行的代码?,java,multithreading,bytecode,Java,Multithreading,Bytecode,我需要帮助。比如我有这样的课 public class ThreadTest { public void runThreads() { Thread t1 = new Thread(() -> { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace()
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。我想得到在第一个和第二个线程中执行的字节码。有办法吗?我想我应该访问类线程
,然后访问其中的方法运行
。但是如何从ThreadTest
执行此操作?您必须理解。分析类java.lang.Thread
的代码没有意义,因为它已经告诉您它将做什么,即它将调用提供的Runnable
实例的run
方法,但该实例将在运行时由LambdaMetaFactory
创建
但是您的类ThreadTest
包含最终将被调用的实际代码。在这门课上,它是放在合成方法中的。当您遍历runThreads()
方法时,您将看到。bsmArgs
参数取决于invokedynamic
指令的实际引导方法,因此必须查找以了解其含义。您将了解到它包含一个指向(类中的)合成目标方法的句柄。因此,您知道该方法包含最终将由另一个线程执行的代码
在您的案例中,您将遇到两条
invokedynamic
指令,它们指向不同的合成方法,表示不同线程执行的不同代码。为什么您要问如何为两个线程执行此操作,从而使问题复杂化?为什么不提供一个较短的代码片段并提出一个更简单的问题呢?我建议您使用Asmiger视图,该视图将向您展示如何使用ASM调用创建代码。