如何使用javap查看哪些字节码行对应于Java代码中的行?

时间:2014-11-11 17:30:03

标签: java javap

我的任务是创建一个计算给定向量大小的方法,然后使用javap -c将其分解。

现在我必须展示幅度框架中每个局部变量对应于java中的哪些,以及字节码的哪些行对应于什么。

这是我制作的方法:

public class Vector {
    /** Magnitude of vector
     * Calculates the magnitude of the vector corresponding
     *   to the array a.
     *
     * @return magnitude
     */
    public double magnitude(double[] a){
        int n = a.length;
        double sum = 1;
        for (int i=0; i<n; i++){
            sum = sum*a[i];
        }
        double magnitude = Math.sqrt(sum);
        return magnitude;
    }
}

这是使用javap -c

的结果
public class Vector { 
  public Vector(); 
    Code: 
       0: aload_0 
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V 
       4: return 

  public double magnitude(double[]); 
    Code: 
       0: aload_1 
       1: arraylength 
       2: istore_2 
       3: dconst_1 
       4: dstore_3 
       5: iconst_0 
       6: istore        5 
       8: iload         5 
      10: iload_2 
      11: if_icmpge     27 
      14: dload_3 
      15: aload_1 
      16: iload         5 
      18: daload 
      19: dmul 
      20: dstore_3 
      21: iinc          5, 1 
      24: goto          8 
      27: dload_3 
      28: invokestatic  #2                  // Method java/lang/Math.sqrt:(D)D 
      31: dstore        5 
      33: dload         5 
      35: dreturn 
}

1 个答案:

答案 0 :(得分:4)

使用javap标记运行-l

$ javap -c -l Vector

Compiled from "Vector.java"
public class Vector {
  public Vector();
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return        
    LineNumberTable:
      line 1: 0

  public double magnitude(double[]);
    Code:
       0: aload_1       
       1: arraylength   
       2: istore_2      
       3: dconst_1      
       4: dstore_3      
       ...
      35: dreturn       
    LineNumberTable:
      line 12: 0
      line 14: 3
      line 16: 5
      line 18: 14
      line 16: 21
      line 22: 27
      line 24: 33
}

例如,您可以看到说明3&amp; 4对应于第14行,其中1被加载到索引为2的double