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

Java 这是编译还是反编译的副作用?,java,casting,compilation,decompiler,type-safety,Java,Casting,Compilation,Decompiler,Type Safety,我们正在运行服务器。一个人被解雇了。他删除了源代码。 我们必须反编译…: 我注意到一些奇怪的东西: 1)随机变量也在程序中间。 2) 哈希映射没有类型安全性,例如 HashMap<Integer , Boolean> s = new HashMap<Integer , Boolean>(); HashMap s=newhashmap(); 变成 HashMap s=新的HashMap(); 同样的事情也发生在列表和集合上。它也有一些副作用 这导致了一些例外 ((长)

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

1)随机变量也在程序中间。 2) 哈希映射没有类型安全性,例如

HashMap<Integer , Boolean> s = new HashMap<Integer , Boolean>();
HashMap s=newhashmap();
变成 HashMap s=新的HashMap(); 同样的事情也发生在列表和集合上。它也有一些副作用 这导致了一些例外 ((长)list.get(a_Long.longValue()); 添加的内容是演员阵容和longValue通话

3) 我还注意到一些垃圾代码

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

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

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

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

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

请阅读以下详细说明:

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

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

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

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


请阅读以下详细说明:

您观察到的是类型擦除和自动装箱的结果。在Java泛型中,泛型类型由编译器强制执行,但字节码级别的底层实现没有泛型类型的概念(它们被“擦除”),这就是为什么这些类型已经消失的原因。类似地,Integer和int之间的转换或Integer和int之间的转换(以及其他原语的转换)通过“自动装箱”完成,这基本上是编译器为您插入这些显式转换方法调用的地方。

您观察到的是类型擦除和自动装箱的结果。在Java泛型中,泛型类型由编译器强制执行,但字节码级别的底层实现没有泛型类型的概念(它们被“擦除”),这就是为什么这些类型已经消失的原因。类似地,Integer和int之间的转换或Integer和int之间的转换(以及其他原语的转换)通过“自动装箱”完成,这基本上是编译器为您插入这些显式转换方法调用的地方。

第一课:使用源代码管理系统,例如,@user3809450一个人被解雇了……把他带回来:)有些反编译器会比其他人更好地处理这些事情。Procyon应该很好地恢复自动(联合国)装箱。它应该可以推断出一些泛型,但仍然存在一些已知的问题。教训:使用源代码管理系统,例如。@user3809450一个人被解雇了。。把他带回来:)一些反编译器会比其他的更好地处理这些事情。Procyon应该很好地恢复自动(联合国)装箱。它应该推断出一些泛型,但仍然存在一些已知的问题。