如何从提取的jar文件中读取一个类文件?

5
我想读取位于.jar包内部的.class文件。如何从.jar包中读取可读的.class文件?
我的环境是:
- 语言版本:Java - 平台版本:Java 1.8.0_73 - 运行时:Java(TM) SE Runtime Environment (build 1.8.0_73-b02) - VM服务器:Java HotSpot(TM) 64-Bit Server VM (build 25.73-b02, mixed mode) - 操作系统:Windows 10 Home (64-bit) [build 10586]
编辑: 我提取了包含二进制和已编译字节码的.class文件: The .class file contains binary & compiled bytecode 我想要的输出结果: The .java file - readable code

2
@JBNizet 他不想编写程序,只是想读取一个 .class 文件。 - RoccoDev
1
我提取了一个.jar文件,但是我无法使用Notepad++读取.class文件。我只想显示和学习代码。 - Suriyaa
3
".class"文件包含二进制编译后的字节码,而不是源代码。".java"文件则包含源代码。" - JB Nizet
1
我使用了7-zip和dg-gui。 - Suriyaa
1
请关注我的回答下面的新评论。 - RoccoDev
显示剩余4条评论
2个回答

16

使用反编译器。我更喜欢使用Fernflower,或者如果你使用IntelliJ IDEA,则可以直接从中打开.class文件,因为它已经预安装了Fernflower。

或者,前往javadecompilers.com,上传您的.jar文件,使用CFR并下载反编译后的.zip文件。

然而,在某些情况下,反编译代码是相当非法的,所以最好去学习而不是去进行反编译。


1
在其他情况下,代码也可能被混淆,因此您无法看到方法名称,因为它们像a()、aB()等。 - RoccoDev
1
我有像 a.class ... l.class 这样的文件。我该怎么办? - Suriyaa
使用反编译器并打开它们。 - RoccoDev
1
或者,前往http://www.javadecompilers.com,上传您的.jar文件,使用CFR并下载反编译的.zip文件。 - RoccoDev
2
请通过选择我的答案将问题标记为已解答,并且如果你愿意的话,给我一个+1。这将非常受欢迎。很高兴它起作用了! - RoccoDev
1
完成了。谢谢。 :-) - Suriyaa

5

以编程方式提取.zip/.jar文件的内容

假设.jar文件是要提取的.jar/.zip文件,destDir是它将被提取到的路径:

java.util.jar.JarFile jar = new java.util.jar.JarFile(jarFile);
java.util.Enumeration enum = jar.entries();
while (enum.hasMoreElements()) {
    java.util.jar.JarEntry file = (java.util.jar.JarEntry) enum.nextElement();
    java.io.File f = new java.io.File(destDir + java.io.File.separator + file.getName());
    if (file.isDirectory()) { // if its a directory, create it
        f.mkdir();
        continue;
    }
    java.io.InputStream is = jar.getInputStream(file); // get the input stream
    java.io.FileOutputStream fos = new java.io.FileOutputStream(f);
    while (is.available() > 0) {  // write contents of 'is' to 'fos'
        fos.write(is.read());
    }
    fos.close();
    is.close();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接