这是编译还是反编译的副作用?

时间:2014-08-19 09:03:03

标签: java casting compilation decompiler type-safety

正在运行服务器。一个人被解雇了。他删除了源代码。 我们必须反编译......: 我注意到了几个奇怪的东西:

1)变量declerations也在随机点的程序中间 2)没有HashMaps的类型安全性,例如

HashMap<Integer , Boolean> s = new HashMap<Integer , Boolean>();

变成了     HashMap s = new HashMap(); 一般来说,列表和收藏集也是如此。它也有一些副作用 这引起了一些例外     ((Long)list.get(a_long).longValue()); 添加的内容是强制转换和longValue调用

3)我也注意到了一些垃圾编码

这些事情是否发生是因为我反编译了程序,还是由于编译器或前开发人员的愚蠢而发生了这些事情?

2 个答案:

答案 0 :(得分:5)

您所观察到的是类型擦除和自动装箱的结果。在Java泛型中,泛型类型由编译器强制执行,但字节代码级别的底层实现没有泛型类型的概念(它们被删除&#34;),这就是为什么它们已经消失。类似地,Integer和int之间的转换(反之亦然)(以及其他基元的转换)通过&#34; autoboxing&#34;这基本上是编译器为您转换这些显式调用转换方法的地方。

答案 1 :(得分:3)

  

这些事情发生了,因为我反编译了程序,或者做了   这些事情是由于前开发人员的编译器或愚蠢而发生的?

这是因为类型擦除的概念。泛型是一个编译时概念,在编译过程中会删除此信息。

泛型被引入到Java语言中,以便在编译时提供更严格的类型检查并支持泛型编程。

如果类型参数是无界的,则将泛型类型中的所有类型参数替换为其边界或对象。因此,生成的字节码只包含普通的类,接口和方法。

阅读本文以获取详细说明:http://docs.oracle.com/javase/tutorial/java/generics/erasure.html