2014-11-11 1 views
1

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

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

ответ

4

Run 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.