gpt4 book ai didi

java - 我可以使用什么命令来查看 Java 某个类的 的详细信息?

转载 作者:行者123 更新时间:2023-11-30 01:54:55 25 4
gpt4 key购买 nike

当我看到 JVM 规范时,它说每个类最多有一个类初始化方法,那就是“clinit”,所以我认为我们应该有一些命令来查看该方法是如何在 .class 文件中编码的。

一开始我以为用javap就可以了,但是发现不行。

最佳答案

javap命令显示<init><clinit>方法...尽管它不使用这些名称。 (请参阅下面的public Test();static {};“方法”。)

或者,您也可以使用另一个反汇编程序。例如 Krakatau 将显示内部名称 "<init>""<clinit>"在其输出中。

I had always thought there was a method name <clinit> in the .class file.

你是对的。这些名称将出现在 .class 中方法的文件表示。并且可以看到内部方法名称<init><clinit>javap 打印的常量表中。

只是 javap 的实现者选择不在方法部分显示这些方法名称。他们使用了不同的符号。

(为什么?我的猜测是,他们认为如果这样做的话,大多数人会更容易理解 javap 输出!他们是对的吗?我不知道,但无论如何这都是没有意义的。)

<小时/>
$ cat Test.java 
public class Test {
static String foo = "hello";
}


$ javap -p -c -s -v Test
Classfile /tmp/Test.class
Last modified Feb 23, 2019; size 293 bytes
MD5 checksum 724ea13308a150d0cc5730edcf4db616
Compiled from "Test.java"
public class Test
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #5.#15 // java/lang/Object."<init>":()V
#2 = String #16 // hello
#3 = Fieldref #4.#17 // Test.foo:Ljava/lang/String;
#4 = Class #18 // Test
#5 = Class #19 // java/lang/Object
#6 = Utf8 foo
#7 = Utf8 Ljava/lang/String;
#8 = Utf8 <init>
#9 = Utf8 ()V
#10 = Utf8 Code
#11 = Utf8 LineNumberTable
#12 = Utf8 <clinit>
#13 = Utf8 SourceFile
#14 = Utf8 Test.java
#15 = NameAndType #8:#9 // "<init>":()V
#16 = Utf8 hello
#17 = NameAndType #6:#7 // foo:Ljava/lang/String;
#18 = Utf8 Test
#19 = Utf8 java/lang/Object
{
static java.lang.String foo;
descriptor: Ljava/lang/String;
flags: ACC_STATIC

public Test();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 1: 0

static {};
descriptor: ()V
flags: ACC_STATIC
Code:
stack=1, locals=0, args_size=0
0: ldc #2 // String hello
2: putstatic #3 // Field foo:Ljava/lang/String;
5: return
LineNumberTable:
line 2: 0
}
SourceFile: "Test.java"

关于java - 我可以使用什么命令来查看 Java 某个类的 <clinit> 的详细信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54838275/

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