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


74

IDEA具有强大的内置功能-反编译器。它可以很好地工作。我可以复制源代码,但是找不到将所有反编译的Java类提取到Java文件的选项。
这个项目有很多Java类和程序包,所以我很想手动复制它。
有谁知道如何提取到Java源文件。谢谢


使用Java字节码反编译器查看内部编译代码-此页面Java Bytecode Decompiler在2020.03中介绍了该插件。通过在Intellij内部使用此捆绑的插件,可以很容易地将其反编译.jar为Java代码。
Scintiller

Answers:


47

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


20
IDEA的默认参数是-hdc=0 -dgs=1 -rsy=1 -rbr=1 -lit=1 -nls=1 -mpm=60您可以在以下链接中看到它们:github
kraken '16

4
有谁知道在IntelliJ IDEA安装中的哪里可以找到fernflower.jar?我/Applications/IntelliJ IDEA CE.app/Contents在Mac上搜索了,但找不到它。
亚历克斯·斯普林

13
@AlexSpurling看看/Applications/IntelliJ IDEA.app/Contents/plugins/java-decompiler/lib/java-decompiler.jar。它被重命名。
naXa

3
顺便说一句,主要课程是org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler
乔治·梁

67

截至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

(您会收到错误的“用法”命令,但它确实起作用)。


22
将此答案与已接受答案的顶部注释合并,启动以使用IDEA默认使用的相同参数的命令是java -cp "/Applications/IntelliJ IDEA.app/Contents/plugins/java-decompiler/lib/java-decompiler.jar" org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -hdc=0 -dgs=1 -rsy=1 -rbr=1 -lit=1 -nls=1 -mpm=60 /absolute/path/to/src1 /absolute/path/to/src2 /absolute/path/to/dst
michele b

2
在Arch上安装:java -cp“ /usr/share/idea/plugins/java-decompiler/lib/java-decompiler.jar” org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -hdc = 0 -dgs = 1 -rsy = 1 -rbr = 1 -lit = 1 -nls = 1 -mpm = 60 / absolute / path / to / src1 / absolute / path / to / src2 / absolute / path / to / dst
mbruns42 '18

2
这个更简短的命令对我有用(基于这些答案和使用说明):java -cp <path> /java-decompiler/lib/java-decompiler.jar org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler- DGS =真<target.jar> <DEST>
选取框

2
Windows decompile.cmd scr1 src2 dst:java -cp "%ProgramFiles%\JetBrains\IntelliJ IDEA 2018.3\plugins\java-decompiler\lib\java-decompiler.jar" org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -hdc=0 -dgs=1 -rsy=1 -rbr=1 -lit=1 -nls=1 -mpm=60 %*
Vadzim

37

请遵循有关IntelliJ JD插件的说明。或参见以下说明的摘录。

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而不是.java。类文件(它不会爆炸jar)。


更新

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

如果您安装了任何IntelliJ产品,则很可能您的计算机上已经装有Fernflower反编译器。IntelliJ IDEA带有Java字节码反编译器插件(捆绑),它是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
    

如果您没有安装IntelliJ产品,请立即下载(可在jetbrains.com下载)或从源代码(可在Github上)制作自己的反编译器可执行文件。


3
我如何获得fernflower.jar?
asmaier

@naXa:真的吗?像Google搜寻时出现了多少实际有用的.jars?其实并不多...
Make42

@ Make42我不明白。好吧,fernflower是一个开源项目。这意味着每个人都可以自己包装一个罐子。
naXa

4
请注意,这将产生源JAR,然后必须将其解压缩以查看反编译的Java文件。您可以使用bash的一个衬里find ./yoursourcesdirectory -name '*.jar' -exec sh -c 'unzip -d "${1%.*}" "$1"' _ {} \;

我确实安装了插件,但找不到任何东西……
Madeo

4

IntelliJ IDEA的反编译器并不是在考虑这种使用的情况下构建的。它仅旨在帮助程序员窥视他们正在开发的Java类的字节码。为了反编译许多您没有源代码的类文件,您将需要一些其他的Java反编译器,专门用于此工作,并且很可能独立运行。如果你用谷歌搜索,你会发现一堆。


但我已经手动复制了代码,它可以工作。也许有任何方法可以自动执行此操作或编写脚本以将其从反编译存档复制到项目中

4

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

IntelliJ IDEA使用的一种是fernflower,但是它不能处理最近的事情-像String / Enum开关,泛型(没有亲自测试过这个,只读过它),...我只是从上述网站尝试了cfr结果与内置的反编译器相同(除了我在课堂上使用的Enum开关)。



2

前一段时间,我使用JAD(JAva反编译器)实现了这一目的-我认为IntelliJ的反编译器并未考虑到导出功能。它更多地是一种工具,可以帮助您浏览没有源的类。

JAD仍可下载,但我认为没有人再维护它了:http : //varaneckas.com/jad/

它有许多插件,即Jadclipse(您猜对了,这是在Eclipse中使用JAD的一种方法-请参见没有代码的反编译类:))。


Intellij反编译器与其他工具相比效果很好,但有时无法反编译lamda,因此它保留了invokedynamic,但我尝试了cfr,它的性能很好,但是其他代码不如intellij,因此我必须复制所有代码手动(


0

有人给出了很好的答案。我一步一步地提出了另一条指令线索。首先,打开您的工作室并进行搜索。您可以找到反编译器为Fernflower。

在此处输入图片说明

其次,我们可以在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选项。

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


-2

或者,您也可以使用WINRAR来提取文件,这很简单。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.