2014-10-02 64 views
1

我熟悉jar结构,它将在classes目录中有一个.class文件,以及包含main()的信息的META-INF目录。如果我导出没有源文件的jar文件,那么真正的java代码驻留在哪里?

但是,真正的java代码驻留在jar中? 它是否存在编译的字节码?但是不同的机器有不同的编译器?

我知道我可以使用反编译器提取java代码,这可能是非法的。但我对这样做并不感兴趣。我更有兴趣了解代码如何存储? 它是否加密?如果是这样,那么加密算法是什么?罐子里的位置是什么?

回答

1

JAR文件只是一个ZIP文件,重命名为Java归档。 你可以检查里面是什么,解压缩它。如果您的操作系统不允许您解压该归档文件,因为它看起来不是压缩文件,只需将扩展名更改为ZIP。 JAR文件未加密。

Java源代码编译为平台无关的Java字节码,这是一种中间二进制。 一旦JVM加载类它要么解释字节码刚刚在时间它编译到底层机器。 JAR文件通常只包含字节码

来源通常不包括在坛子里,尤其是对分布。有些项目也将源代码放在单独的存档中。你应该检查你正在处理的JAR的提供者以获取源代码。

如果反编译是非法的,取决于应用于JAR的许可条款。你应该检查这些。反编译一个类对象并不是一件容易的事,但一个人过去常常用他的JAD做一个很好的工作。 不幸的是它没有更多的维护,但有一些网站,你仍然可以下载它。 反编译的类不会完全看作真正的源代码,您可能需要进行一些更改,但您肯定会对源代码有所了解。

3

除非另有说明,否则源代码是而不是包含在JAR文件中的。 JAR文件通常只包含类文件(编译的JVM指令),而不包含源代码。

+0

我在这里有点困惑。如何在没有实际代码的情况下提供它的功能?必须有一些格式的jar内的实际代码?如果反编译器不存在,反编译器如何提取代码? – rents 2014-10-02 05:25:17

+2

@rents参见http://en.wikipedia.org/wiki/Java_bytecode - 与“解释”语言不同,Java被*编译为特殊的字节码,后来由JVM运行。一个反编译器可以*只提取当前内容;例如局部变量名称(不是参数),格式化和注释等都会丢失。一个“好”的反编译器会尽可能地尝试和重构给定的上下文,但它仍然是一个有损源码 - >字节码 - >源码转换。 – user2864740 2014-10-02 05:25:36

+0

好的。所以你所说的是源代码存储为可以由不同机器的不同JVM运行的Java字节码。但它在罐子里的物理存储位置? – rents 2014-10-02 05:29:14