正在运行服务器。一个人被解雇了。他删除了源代码。 我们必须反编译......: 我注意到了几个奇怪的东西:
1)变量declerations也在随机点的程序中间 2)没有HashMaps的类型安全性,例如
HashMap<Integer , Boolean> s = new HashMap<Integer , Boolean>();
变成了 HashMap s = new HashMap(); 一般来说,列表和收藏集也是如此。它也有一些副作用 这引起了一些例外 ((Long)list.get(a_long).longValue()); 添加的内容是强制转换和longValue调用
3)我也注意到了一些垃圾编码
这些事情是否发生是因为我反编译了程序,还是由于编译器或前开发人员的愚蠢而发生了这些事情?
答案 0 :(得分:5)
您所观察到的是类型擦除和自动装箱的结果。在Java泛型中,泛型类型由编译器强制执行,但字节代码级别的底层实现没有泛型类型的概念(它们被删除&#34;),这就是为什么它们已经消失。类似地,Integer和int之间的转换(反之亦然)(以及其他基元的转换)通过&#34; autoboxing&#34;这基本上是编译器为您转换这些显式调用转换方法的地方。
答案 1 :(得分:3)
这些事情发生了,因为我反编译了程序,或者做了 这些事情是由于前开发人员的编译器或愚蠢而发生的?
这是因为类型擦除的概念。泛型是一个编译时概念,在编译过程中会删除此信息。
泛型被引入到Java语言中,以便在编译时提供更严格的类型检查并支持泛型编程。
如果类型参数是无界的,则将泛型类型中的所有类型参数替换为其边界或对象。因此,生成的字节码只包含普通的类,接口和方法。
阅读本文以获取详细说明:http://docs.oracle.com/javase/tutorial/java/generics/erasure.html