2016-06-07 83 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(); 
} 

其余代码几乎就是你写的。