- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 javap
检查了我的类文件命令,我无法理解下面的部分
Classfile /D:/WaitNotifyExample.class
Last modified Dec 20, 2013; size 622 bytes
MD5 checksum 4781f8cf8062fa75efa30c76adc25cfb
Compiled from "WaitNotifyExample.java"
public class WaitNotifyExample
SourceFile: "WaitNotifyExample.java"
minor version: 0
major version: 51
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #12.#24 // java/lang/Object."<init>":()V
#2 = Class #25 // java/lang/String
#3 = String #26 // I am hidden
#4 = Methodref #2.#27 // java/lang/String."<init>":
(Ljava/lang/String;)V
#5 = Fieldref #11.#28 // WaitNotifyExample.s1:Ljava/lang/String;
#6 = String #29 // I am diving into Pool
#7 = Fieldref #11.#30 // WaitNotifyExample.s2:Ljava/lang/String;
#8 = Fieldref #31.#32 // java/lang/System.out:Ljava/io/PrintStream;
#9 = String #33 // hello World
#10 = Methodref #34.#35 // java/io/PrintStream.println:
(Ljava/lang/String;)V
#11 = Class #36 // WaitNotifyExample
#12 = Class #37 // java/lang/Object
#13 = Utf8 s1
#14 = Utf8 Ljava/lang/String;
#15 = Utf8 s2
#16 = Utf8 <init>
#17 = Utf8 ()V
#18 = Utf8 Code
#19 = Utf8 LineNumberTable
#20 = Utf8 main
#21 = Utf8 ([Ljava/lang/String;)V
#22 = Utf8 SourceFile
#23 = Utf8 WaitNotifyExample.java
#24 = NameAndType #16:#17 // "<init>":()V
#25 = Utf8 java/lang/String
#26 = Utf8 I am hidden
#27 = NameAndType #16:#38 // "<init>":(Ljava/lang/String;)V
#28 = NameAndType #13:#14 // s1:Ljava/lang/String;
#29 = Utf8 I am diving into Pool
#30 = NameAndType #15:#14 // s2:Ljava/lang/String;
#31 = Class #39 // java/lang/System
#32 = NameAndType #40:#41 // out:Ljava/io/PrintStream;
#33 = Utf8 hello World
#34 = Class #42 // java/io/PrintStream
#35 = NameAndType #43:#38 // println:(Ljava/lang/String;)V
#36 = Utf8 WaitNotifyExample
#37 = Utf8 java/lang/Object
#38 = Utf8 (Ljava/lang/String;)V
#39 = Utf8 java/lang/System
#40 = Utf8 out
#41 = Utf8 Ljava/io/PrintStream;
#42 = Utf8 java/io/PrintStream
#43 = Utf8 println
{
public java.lang.String s1;
flags: ACC_PUBLIC
public java.lang.String s2;
flags: ACC_PUBLIC
public WaitNotifyExample();
flags: ACC_PUBLIC
Code:
stack=4, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: aload_0
5: new #2 // class java/lang/String
8: dup
9: ldc #3 // String I am hidden
11: invokespecial #4 // Method java/lang/String."<init>":(Ljava/lang/String;)V
14: putfield #5 // Field s1:Ljava/lang/String;
17: aload_0
18: new #2 // class java/lang/String
21: dup
22: ldc #6 // String I am diving into Pool
24: invokespecial #4 // Method java/lang/String."<init>":(Ljava/lang/String;)V
27: putfield #7 // Field s2:Ljava/lang/String;
30: return
LineNumberTable:
line 2: 0
line 4: 4
line 5: 17
public static void main(java.lang.String[]);
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=2, args_size=1
0: iconst_0
1: istore_1
2: getstatic #8 // Field java/lang/System.out:Ljava/io/PrintStream;
5: ldc #9 // String hello World
7: invokevirtual #10 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
10: return
LineNumberTable:
line 7: 0
line 8: 2
line 9: 10
}
编辑:下面是相应的java代码。
public class WaitNotifyExample {
public String s1 = new String("I am hidden");
public String s2 = new String("I am diving into Pool");
public static void main(String[] args) {
int mainLiteral = 0;
System.out.println("hello World");
}
}
我不明白上述类文件中的以下内容:
最佳答案
stack=4, locals=1, args_size=1
字节码中的值存储在局部变量槽和操作数堆栈中。每个插槽最多可以有 2^16 - 1 个插槽,但出于效率原因,您需要指定堆栈和局部变量的限制,以便在您实际不使用它时不会浪费所有空间。
在编译的代码中,编译器会自动将其计算为函数中实际使用的最小值。在本例中,它使用操作数堆栈中的 4 个槽和局部变量表中的 1 个槽。我不确定 arg_size 是什么,但我猜测这只是参数的总大小(即参数的数量)。无论如何,这与类文件格式的任何功能都不对应,因此无论它是什么,javap都会手动计算并插入它。
LineNumberTable: section
LineNumberTable 是保存用于调试目的的元数据的可选属性之一。在这种情况下,它指定字节码中的哪些偏移量对应于原始源代码中的每一行。这对于打印更多信息堆栈跟踪以及提供诸如调试器中的单步之类的功能非常有用。
关于java - javap命令的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20697091/
public static java.util.List getFoo(java.lang.String) 上述方法返回一个 List ,但是 javap命令返回以上内容(它没有显示 List 是 S
我正在阅读 Herbert Schilds 关于 java 中泛型类型删除的文章。据说在类上运行 javap 应该会在类型删除后为我提供有关公共(public)、包保护和 protected 字段和方
我正在阅读 Herbert Schilds 关于 java 泛型中类型删除的文章。据推测,在类上运行 javap 应该会在类型删除后为我提供有关公共(public)、包保护和 protected 字段
我们能否以可编程的方式在我们自己的 java 代码中使用 javap? 例如下面的代码: public class TestClass { public static void main(St
我创建了一个非常简单的类 Test.java import java.util.*; public class Test { public static void main(String[]
javap命令有几个选项,其中之一是-l,它可以打印行号和局部变量表。假设一个java程序已经编译成功,并且有“Main.class”文件,那么运行javap -l Main会产生如下内容: publ
在 java profiler 命令输出中,我在尖括号中看到了这些符号,例如 java.util.Queue java.util.TreeMap 如果我错了,请纠正我;通过一些练习,我已经能够将 E-
每次我试图理解已编译 Java 文件的反汇编代码时,我都想知道为什么缺少一些指令编号。 一个小例子: 我反汇编了 ($ javap -c HelloWorld) 一个简单的 HelloWorld 类。
如果我编译如下源代码: 1. public class Example { 2. public boolean foo(boolean a, boolean b, char ch) { 3.
有关常量池的 javap 命令生成的输出的小问题。当 javap 打印池时,它将字符串常量定义为 Asciz 字符串,我理解这意味着 null 终止 Ascii: const #20 = Asciz
Javac/javap 自带工具简单使用 Created: Mar 10, 2021 2:37 PM 使用javac 加上文件的目录 可以将.java 文件编译为.class 文件 (注意:需
实际上,这个问题有点广泛。我知道 javac 将 java 文件编译成字节码,一个类文件。所以,类文件应该包含 jvm 指令等等。另一方面,查看这些指令的唯一方法是使用 javap -c 反编译类文件
我有一个非常简单的类(class): package MyDev; public class Point3D { public Point3D(){x = 0; y = 0;z = 0;}
我创建一个名为 JVMClassTest 的 Java 类,然后进行编译。之后,我运行“javap -verbose JVMClassTest”。常量池的#4在哪里。 public class
在网上看java编译才知道 public class Test { private String s = "TESTTEST"; } 到 public class Test { pri
这是一个非常特殊的案例,似乎是 .class 文件损坏。我们的应用程序依赖于其他团队提供的依赖项。有 2 个相关的 java 文件:FTGService 和 FTGServiceLight 实现 FT
我试图找出类文件中常量池部分下的以下两个条目: int foo(int x) { return x; } #11 = Utf8 foo #12 = Utf8
众所周知,在 java 中,javap(java 解析器)实用程序显示类中的所有方法名称。 Dot-Net 有等效的实用程序吗? 最佳答案 您必须使用反射。试试这个代码: var methodName
当我用 javap 反汇编枚举时,枚举的隐式构造函数参数似乎丢失了,我不明白为什么。 这是一个枚举: enum Foo { X } 我用这个命令编译和反汇编这个(在 Java 8u60 上): jav
在一个非常简单的 HelloWorld 应用程序上运行 javap 时,我对常量池周围的输出有些困惑。 测试代码 public class TestClass { public static
我是一名优秀的程序员,十分优秀!