确定是否使用调试信息编译.class文件?
如何确定任何 Java .class 文件是否使用调试信息进行编译?
我如何确切地知道使用了什么 -g{source|lines|vars} 选项?
如何确定任何 Java .class 文件是否使用调试信息进行编译?
我如何确切地知道使用了什么 -g{source|lines|vars} 选项?
如果你在命令行上,那么javap -l将显示LineNumberTable和LocalVariableTable(如果存在):
peregrino:$ javac -d bin -g:none src/Relation.java
peregrino:$ javap -classpath bin -l Relation
public class Relation extends java.lang.Object{
public Relation();
peregrino:$ javac -d bin -g:lines src/Relation.java
peregrino:$ javap -classpath bin -l Relation
public class Relation extends java.lang.Object{
public Relation();
LineNumberTable:
line 1: 0
line 33: 4
peregrino:$ javac -d bin -g:vars src/Relation.java
peregrino:$ javap -classpath bin -l Relation
public class Relation extends java.lang.Object{
public Relation();
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this LRelation;
javap -c
如果反编译开始时存在,将显示源文件:
peregrino:$ javac -d bin -g:none src/Relation.java
peregrino:$ javap -classpath bin -l -c Relation | head
public class Relation extends java.lang.Object{
...
peregrino:$ javac -d bin -g:source src/Relation.java
peregrino:$ javap -classpath bin -l -c Relation | head
Compiled from "Relation.java"
public class Relation extends java.lang.Object{
...
在编程上,我会查看ASM,而不是编写另一个字节码读取器。
必须检查类文件中的 Code
结构,并查找 LineNumberTable
和 LocalVariableTable
属性。
像ASM或Apache Commons BCEL(字节码工程库)这样的工具将有所帮助:https://commons.apache.org/proper/commons-bcel/apidocs/index.html?org/apache/bcel/classfile/LineNumberTable.html