Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用ASM获取在另一个线程中执行的代码?_Java_Multithreading_Bytecode - Fatal编程技术网

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调用创建代码。