gpt4 book ai didi

Java 字节码缺少局部变量表

转载 作者:行者123 更新时间:2023-12-01 17:52:49 25 4
gpt4 key购买 nike

在查看JDK1.7的字节码时,发现rt.jar中的一些Java类(例如javax.swing.event.EventListenerList)的字节码不包含本地变量表。例如,我使用 javap -v -p -l EventListenerList.class 命令并获取 add 方法的字节码,如下所示:

public synchronized <T extends java.util.EventListener> void add(java.lang.Class<T>, T);descriptor: (Ljava/lang/Class;Ljava/util/EventListener;)Vflags: ACC_PUBLIC, ACC_SYNCHRONIZEDCode:  stack=5, locals=5, args_size=3     0: aload_2     1: ifnonnull     5     4: return     5: aload_1     6: aload_2     7: invokevirtual #133                // Method java/lang/Class.isInstance:(Ljava/lang/Object;)Z    ...   116: aload_0   117: aload         4   119: putfield      #128                // Field listenerList:[Ljava/lang/Object;   122: return  StackMapTable: number_of_entries = 4    frame_type = 5 /* same */    frame_type = 43 /* same */    frame_type = 28 /* same */    frame_type = 43 /* same */  LineNumberTable:    line 179: 0    line 183: 4    line 185: 5    line 186: 13    ...    line 200: 109    line 202: 116    line 204: 122Signature: #85                          // <T::Ljava/util/EventListener;>(Ljava/lang/Class<TT;>;TT;)V

我们可以看到该方法有两个局部变量,但是JDK字节码没有显示局部变量表。我的问题是:

  1. 为什么没有显式局部变量表的字节码会被验证?
  2. 运行这样的字节码时,JVM 如何获取启动 PC、名称和签名?

最佳答案

局部变量表仅用于调试目的 - 它对字节码的执行没有任何直接影响。您可以通过传递 -g:none 告诉 javac 将它们排除在外。

至于第二个问题,则不然。 JVM 并不关心您在源代码级别声明的变量 - 它所看到的只是在字节码中传递的值。

关于Java 字节码缺少局部变量表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48134871/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com