2016-06-07 97 views
1

林開發Android和使用jitpack.ioJava不反編譯正確

從混帳與gradle這個編譯

我試着去使用這個庫從git的函數式編程:

fj - functional programmming for Java 7

我即使所有內容都經過測試,仍然運行代碼併發生錯誤。

的問題是在類的GroupBy:

的源代碼:

public Collection<Group<S,T>> execute(Collection<T> collection){ 
    Hashtable<S, Group<S, T>> groups = new Hashtable<S, Group<S, T>>(); 

    for (T item: collection){ 
     S classification = grouper.select(item); 

     if (!groups.contains(classification)){ 
      groups.put(classification, new Group<S, T>(classification)); 
     } 
     groups.get(classification).add(item); 
    } 

    return groups.values(); 
} 

德編譯代碼:

public Collection<GroupBy.Group<S, T>> execute(Collection<T> collection) { 
    Hashtable groups = new Hashtable(); 

    Object item; 
    Object classification; 
    for(Iterator var3 = collection.iterator(); var3.hasNext(); ((GroupBy.Group)groups.get(classification)).add(item)) { 
     item = var3.next(); 
     classification = this.grouper.select(item); 
     if(!groups.contains(classification)) { 
      groups.put(classification, new GroupBy.Group(classification)); 
     } 
    } 

    return groups.values(); 
} 

我希望得到任何幫助。

目前我沒有看到任何理由爲什麼代碼看起來不同

感謝

+1

反編譯器不會真正反編譯爲確切的源代碼。因爲它只能看到字節代碼,它會嘗試反編譯爲儘可能接近源代碼的東西,但即使它應該執行相同的操作,您也不會真正獲得以前的確切代碼。 –

+0

好的。我得到了一個答案... 1.解編譯代碼完全一樣。這只是編譯器 2的代碼和優化的轉換。我遇到的錯誤是因爲我使用'contains'而不是'containKey' – Gur

回答

1

簡短的回答是,當Java是遵守信息丟失。但是,反編譯的代碼功能與您編寫的代碼完全相同。

讓我們看看它一行行...

public Collection<GroupBy.Group<S, T>> execute(Collection<T> collection) { 

這是相同的,但它給了Group類的全名。

Hashtable groups = new Hashtable(); 
    Object item; 
    Object classification; 

正如您在這裏所看到的,變量名稱和所有通用信息都會丟失。 java中的泛型可以被認爲是提示編譯器來檢查錯誤。一旦編譯器完成編譯,信息就會被丟棄(通常)。

for(
     Iterator var3 = collection.iterator(); 
     var3.hasNext();       
     ((GroupBy.Group)groups.get(classification)).add(item) 
    ) { 

增強型for循環已被循環經典代替。這是因爲在字節碼中它們是相同的東西(儘管更聰明的反編譯器可能已經知道了這一點,並在這裏寫了一個增強的for循環)。

另一個有趣的事情是,編譯器已經將groups.get(...).add(...)語句放在for循環中。如果您考慮for(initialisation; termination; increment)的合約,則在每次循環迭代時都會發生increment。所以即使你在循環中寫了你的語句,它也是一樣的效果。 [這樣做可能有很好的理由,儘管我不是一個編譯器大師,所以我不能肯定地說]。

 item = var3.next(); 
     classification = this.grouper.select(item); 
     if(!groups.contains(classification)) { 
      groups.put(classification, new GroupBy.Group(classification)); 
     } 
    } 

    return groups.values(); 
} 

其餘代碼幾乎就是你寫的。