如何让Java编译器在编译后的代码中生成行号

4

我有一个名为A.class的"hello world"程序。它是使用命令javac A.java编译的。它只是打印"hello world"

接下来,我使用javac -g A.java进行编译。我期望能看到行号,但是没有看到。你知道发生了什么吗?

我在javac编译的.class文件和javac -g编译的.class文件中看到了一些特殊字符的非常微小的差异。但是我看不到任何行号。

我对此感到好奇,因为我想找出行号对性能可能产生的影响。其次,我想知道log4j等如何维护用于日志记录的行号。谢谢。


3
-g 用于生成调试信息。class文件是字节码,不是人类可读的。您可以使用javap来反汇编一个class文件。 - OldProgrammer
1
你是否真的将.class文件的内容粘贴到问题中了?你真的这样做了吗?如果我可以问一下,为什么你要这样做两次呢? - Mike Nakis
@ApurvaSingh 最好输入源代码而不是字节码。因为输入字节码没有意义。如果您输入源代码,您可能会更快地得到答案。 - Roshana Pitigala
如果您需要了解某些代码行的性能,有很多方法可以对其进行分析。其中最简单的方法是在给定的行或方法之前和之后打印或记录执行时间。 - Jim Kiley
不行,Jim。打印和日志记录需要消耗自己的时间,这会扭曲我的计时。我只想知道哪些是行号!javac -g 会生成行号吗?如果是的话,它们在哪里?log4j 如何确定行号。 - Apurva Singh
显示剩余4条评论
1个回答

5
编译命令很好,-g 打开调试信息生成。顺便说一下,默认情况下会生成行号,需要 -g:none 或类似选项关闭它。
缺少的是一种有意义地检查生成的 .class 文件的方法,类似于工具如何使用它。请尝试:
$ javap -l -c A.class

-l选项会打印行号表。 -c选项会打印反汇编的字节码指令(可能很有趣,因为行号表将源代码行号与字节码指令相关联)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接