Как использовать javap, чтобы увидеть, какие строки байт-кода соответствуют строкам в коде Java?

Мне было поручено создать метод, который вычисляет величину данного вектора, а затем использовал 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 ответ

Бежать 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 и 4 соответствуют строке 14, где 1 загружается в double по индексу 2.

Другие вопросы по тегам