Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 确定.class文件是否使用调试信息编译?_Java_Class_Debugging - Fatal编程技术网

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

Java 确定.class文件是否使用调试信息编译?,java,class,debugging,Java,Class,Debugging,如何确定任何Java.class文件是否使用调试信息编译 我怎样才能确切地知道使用了什么-g{source | lines | vars}选项?您必须检查类文件中的,并查找和属性 类似于或Apache Commons BCEL(字节码工程库)的工具将有所帮助:如果您在命令行上,则javap-l将显示LineNumberTable和LocalVariableTable(如果存在): peregrino:$ javac -d bin -g:none src/Relation.java peregr

如何确定任何Java.class文件是否使用调试信息编译

我怎样才能确切地知道使用了什么-g{source | lines | vars}选项?

您必须检查类文件中的,并查找和属性


类似于或Apache Commons BCEL(字节码工程库)的工具将有所帮助:

如果您在命令行上,则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{
  ...

从编程的角度来说,我希望看到而不是编写另一个字节码读取器。

基于以上两个答案(Aaron Digulla和Pete Kirkham),您可以使用
javap-v
直接检查JARP文件或类文件。我发现这比使用类路径要简单一些。
需要单引号用于jarfile案例

javap -v 'jar:file:///Absolute/Path/To/JarFile.jar!/package/name/using/slashes/ClassName.class' | grep "\(Compiled from\|LineNumberTable\|LocalVariableTable\)" | head
或者(不需要检查类文件的绝对路径)


如果结果不清楚或格式更改,请转到
less
而不是
grep
,然后查看。

这些链接现在都断开了。@GreenGiant已修复。
javap -v Path/To/ClassName.class | grep "\(Compiled from\|LineNumberTable\|LocalVariableTable\)" | head