如何反编译为java文件intellij的想法

时间:2015-02-08 00:04:49

标签: java intellij-idea java-8 decompiling

IDEA有一个很棒的内置功能 - 反编译器。它工作得很好。我可以复制源代码,但我找不到将所有反编译的java类提取到java文件的选项 这个项目有很多java类和包,所以我将长时间手动复制它 有谁知道如何提取到java源文件。   THX

11 个答案:

答案 0 :(得分:32)

截至2017年8月和IntelliJ V2017.2,已接受的答案似乎不再完全准确:没有fernflower.jar可供使用。

jar文件名为java-decompiler.jar,不包含主清单...而是可以使用以下命令(来自Mac安装):

java -cp "/Applications/IntelliJ IDEA.app/Contents/plugins/java-decompiler/lib/java-decompiler.jar" org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler

(你会得到错误的 Usage 命令,但确实有效。)

答案 1 :(得分:29)

要从jar命令行使用IntelliJ Java反编译器,请按照此处提供的说明操作: https://github.com/JetBrains/intellij-community/tree/master/plugins/java-decompiler/engine

答案 2 :(得分:19)

按照IntelliJ JD plugin的说明操作。或者参阅以下说明中的摘录。

java -jar fernflower.jar [<source>]+ <destination>
  

+表示1次或更多次   <source>:包含要​​反编译的文件的文件或目录。目录以递归方式扫描。允许的文件扩展名是class,zip和jar   <destination>:目标目录

示例:

java -jar fernflower.jar -hdc=0 -dgs=1 -rsy=1 -lit=1 c:\Temp\binary\ -e=c:\Java\rt.jar c:\Temp\source\

请注意,如果您为源传递“.jar”文件,它将在目标中创建另一个“.jar”文件,但是,在新的“.jar”文件中,文件将为.java而不是.class文件(它不会爆炸jar)。

更新

人们问我:我如何获得fernflower.jar?

如果您安装了任何IntelliJ产品,很可能您的计算机上已经安装了Fernflower反编译器。 IntelliJ IDEA附带Java Bytecode Decompiler插件(捆绑),这是Fernflower的现代扩展。

  1. ${IntelliJ_INSTALL_DIR}\plugins\java-decompiler\lib\java-decompiler.jar中找到该文件(例如:C:\ Program Files \ JetBrains \ IntelliJ IDEA 2018 \ plugins \ java-decompiler \ lib)。
  2. 将其复制到某处并重命名为fernflower.jar(可选)。
  3. 此JAR不可执行,因此我们无法使用java -jar运行它。无论如何这样的工作:

    java -cp fernflower.jar org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler [<source>]+ <destination>
    

    org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler是包含运行反编译器的主要方法的类。

    示例:

    mkdir output_src
    java -cp fernflower.jar org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -hdc=0 -dgs=1 -rsy=1 -lit=1 ./input.jar ./output_src
    
  4. 如果您没有安装IntelliJ产品,请立即下载(在jetbrains.com上提供)或从源(可在Github上获得)制作您自己的反编译器可执行文件。

答案 3 :(得分:3)

您可以使用其中一种(您可以在线使用它们或下载它们,有关于它们的一些信息): http://www.javadecompilers.com/

一个IntelliJ IDEA使用的是fernflower,但它无法处理最近的事情 - 比如String / Enum开关,泛型(没有亲自测试这个,只读过它),... 我刚从上面的网站上试过cfr,结果与内置的反编译器相同(除了我班上的Enum开关)。

答案 4 :(得分:2)

IntelliJ IDEA的反编译器并没有考虑到这种用法。它只是为了帮助程序员查看他们正在开发的java类的字节码。为了反编译许多你没有源代码的类文件,你需要一些专门用于这个工作的其他java反编译器,并且很可能是独立运行的。如果你谷歌你应该找到一堆。

答案 5 :(得分:2)

前段时间我使用JAD(JAva Decompiler)来实现这一目标 - 我认为IntelliJ的反编译器并没有考虑到出口。它更像是一种帮助查看源不可用的类的工具。

JAD仍然可供下载,但我认为不再有任何人继续下载:http://varaneckas.com/jad/

有很多插件,即Jadclipse(你猜对了,在Eclipse中使用JAD的一种方法 - 参见代码不可用的反编译类:)。)。

答案 6 :(得分:1)

尝试

https://github.com/fesh0r/fernflower

下载jar

http://files.minecraftforge.net/maven/net/minecraftforge/fernflower/

命令:

java -jar fernflower.jar -hes=0 -hdc=0 C:\binary  C:\source

将您的jar文件放在文件夹C:\ binary中,将提取源并将其打包在C:\ source中的jar中。

享受!

答案 7 :(得分:1)

我使用JD-GUI将所有反编译的Java类提取到Java文件中。

答案 8 :(得分:1)

  1. 打开现有项目或创建新项目
  2. 转到项目设置 -> 库。点击+符号在库中添加要反编译的jar
  3. 在左侧显示的项目结构对话框中转到外部库。搜索您在上一步中添加的 jar 名称。导航到所需的类或包。

你可以看到那个jar的反编译java文件

答案 9 :(得分:0)

有人给出了很好的答案。我一步一步地提出了另一个指导线索。 首先,打开您的工作室并进行搜索。您会发现反编译器是Fernflower。

enter image description here

第二,我们可以在plugins目录中找到它。

/Applications/Android Studio.app/Contents/plugins/java-decompiler/lib/java-decompiler.jar

第三次,运行它,您将获得用法

java -cp "/Applications/Android Studio.app/Contents/plugins/java-decompiler/lib/java-decompiler.jar" org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler

Usage: java -jar fernflower.jar [-<option>=<value>]* [<source>]+ <destination>
Example: java -jar fernflower.jar -dgs=true c:\my\source\ c:\my.jar d:\decompiled\

最后,根据IdeaIdcompiler.kt

,工作室的反编译器嵌套选项如下。

-hdc = 0 -dgs = 1 -rsy = 1 -rbr = 1 -lit = 1 -nls = 1 -mpm = 60 -lac = 1

IFernflowerPreferences.HIDE_DEFAULT_CONSTRUCTOR to "0",
        IFernflowerPreferences.DECOMPILE_GENERIC_SIGNATURES to "1",
        IFernflowerPreferences.REMOVE_SYNTHETIC to "1",
        IFernflowerPreferences.REMOVE_BRIDGE to "1",
        IFernflowerPreferences.LITERALS_AS_IS to "1",
        IFernflowerPreferences.NEW_LINE_SEPARATOR to "1",
        **IFernflowerPreferences.BANNER to BANNER,**
        IFernflowerPreferences.MAX_PROCESSING_METHOD to 60,
        **IFernflowerPreferences.INDENT_STRING to indent,**
        **IFernflowerPreferences.IGNORE_INVALID_BYTECODE to "1",**
        IFernflowerPreferences.VERIFY_ANONYMOUS_CLASSES to "1",
         **IFernflowerPreferences.UNIT_TEST_MODE to if (ApplicationManager.getApplication().isUnitTestMode) "1" else "0")**

我找不到星号项目的sutialbe选项。

希望这些步骤可以使问题更清楚。

答案 10 :(得分:-2)

或者,您也可以通过WINRAR来提取文件。