确定.class文件是否使用调试信息编译?

Ato*_*tos 38 java debugging class

如果使用调试信息编译,我如何确定任何Java .class文件?

如何确切地说出使用了-g {source | lines | vars}选项?

Pet*_*ham 44

如果你在命令行上,那么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;
Run Code Online (Sandbox Code Playgroud)

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{
  ...
Run Code Online (Sandbox Code Playgroud)

从编程上来说,我会考虑ASM,而不是编写另一个字节码阅读器.