当前位置: 首页 > 知识库问答 >
问题:

缺少局部变量表的Java字节码

郦楷
2023-03-14

在检查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;)V
flags: ACC_PUBLIC, ACC_SYNCHRONIZED
Code:
  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: 122
Signature: #85                          // <T::Ljava/util/EventListener;>(Ljava/lang/Class<TT;>;TT;)V
    null

共有1个答案

董品
2023-03-14

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

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

 类似资料:
  • 问题内容: 我想填充用的与经典ASP / VBScript中的站点。这些值是从SQL Server数据库读取和获取的,其代码类似于: 我的问题是似乎只有一侧可以评估。 随着我得到: 随着我得到: 应该采取什么措施缓解这一问题? 问题答案: 试试这个:

  • 本文向大家介绍Java中的局部变量,包括了Java中的局部变量的使用技巧和注意事项,需要的朋友参考一下 局部变量在方法,构造函数或块中声明。 输入方法,构造函数或块时将创建局部变量,并且一旦退出方法,构造函数或块,该变量将被销毁。 访问修饰符不能用于局部变量。 局部变量仅在声明的方法,构造函数或块内可见。 局部变量在内部在堆栈级别实现。 局部变量没有默认值,因此应声明局部变量,并应在首次使用前分配

  • 问题内容: 我以为我了解了Java中局部变量和全局变量之间的区别,直到今天看到一个示例。在这段代码中,我们尝试将元素添加到方法的链接列表中: 我不明白的是,为什么在关闭方法后newElement不会消失?因为这是局部变量,并且未在任何地方的类中定义。这是此类的完整代码: } 先感谢您 问题答案: 这是 变量 和 对象的 混合,确实是局部变量,在方法结束后会丢失,但是引用指向一个 对象 。如果没有引

  • 主要内容:局部变量,全局变量,局部变量和全局变量的综合示例在《 C语言形参和实参的区别》中提到,形参变量要等到函数被调用时才分配内存,调用结束后立即释放内存。这说明形参变量的作用域非常有限,只能在函数内部使用,离开该函数就无效了。 所谓 作用域( Scope ) ,就是变量的有效范围。 不仅对于形参变量,C语言中所有的变量都有自己的作用域。决定变量作用域的是变量的定义位置。 局部变量 定义在函数内部的变量称为 局部变量(Local Variable) ,

  • Lua 的设计有一点很奇怪,在一个 block 中的变量,如果之前没有定义过,那么认为它是一个全局变量,而不是这个 block 的局部变量。这一点和别的语言不同。容易造成不小心覆盖了全局同名变量的错误。 定义 Lua 中的局部变量要用 local 关键字来显式定义,不使用 local 显式定义的变量就是全局变量: g_var = 1 -- global var local l_va

  • 简介 在前面的章节中,我已经讲述了如何定义函数。在本节中,我讲介绍局部变量,这将会使定义函数变得更加容易。 let表达式 使用let表达式可以定义局部变量。格式如下: (let binds body) 变量在binds定义的形式中被声明并初始化。body由任意多个S-表达式构成。binds的格式如下: [binds] → ((p1 v1) (p2 v2) ...) 声明了变量p1、p2,并分别