fernflower

JetBrainsApache-2.0活跃维护

把 Java 字节码反编译回可读 Java 源码,IntelliJ IDEA 内置的反编译器就是它,适合排查依赖库和逆向分析。

Decompiler from Java bytecode to Java, used in IntelliJ IDEA.

暂无版本4,439star +4 / 7 天731fork同步于 2026-11-10 17:39 UTC

怎么上手

由 README 提炼,执行前请确认
java -jar fernflower.jar [-<option>=<value>]* [<source>]+ <destination>
硬件要求按 README 说明

README 未说明

下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

JetBrains 出品的 Java 字节码反编译器,能把 class、jar 还原成可读 Java 源码

把 Java 字节码反编译回可读 Java 源码,IntelliJ IDEA 内置的反编译器就是它,适合排查依赖库和逆向分析。

核心能力

  • 递归扫描目录,支持 class、zip、jar 输入
  • 用 -e= 指定库文件辅助分析类与方法关系
  • 支持 -ren=1 重命名混淆后的类与成员
  • 可自定义 IIdentifierRenamer 实现重命名策略
  • 提供泛型签名、lambda、record 等反编译选项

容易踩的坑

命令行需自行准备 fernflower.jar,README 只给出用法未给下载方式;-e= 指定的库文件只参与分析不会被反编译;重命名需 -ren=1 且自定义类要放在应用 classpath 上

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

0 个版本

暂无 release 数据(可能没有发版,或尚未同步)。

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    Fernflower

    Fernflower is the first actually working analytical decompiler for Java and probably for a high-level programming language in general.

    Releases are published in the Intellij Community repository.

    Please send your bug reports and feature requests to the issue tracker (in subsystem Java. Decompiler. Engine).

    IntelliJ usage

    Fernflower is bundles as in IntelliJ IDEA and is primarily used to show Java code when debugging or navigating through class files.

    Command line usage

    Fernflower can be run from the command line in stand-alone mode using the following command:

    java -jar fernflower.jar [-<option>=<value>]* [<source>]+ <destination>
    

    * means zero or more times

    + means one or more times

    <source>: file or directory with files to be decompiled. Directories are recursively scanned. Allowed file extensions are class, zip and jar. Sources prefixed with -e= mean "library" files that won't be decompiled but taken into account when analyzing relationships between classes or methods. Especially renaming of identifiers (see the ren option) can benefit from information about external classes.

    <destination>: destination directory to place the resulting Java source into

    <option>=<value>: a command-line option with the corresponding value (see "Command-line options" below).

    Examples
    java -jar fernflower.jar -hes=0 -hdc=0 c:\Temp\binary\ -e=c:\Java\rt.jar c:\Temp\source\
    
    java -jar fernflower.jar -dgs=1 c:\Temp\binary\library.jar c:\Temp\binary\Boot.class c:\Temp\source\
    
    Command-line options

    Except for mpm and urc the value of 1 means the option is activated, 0 - deactivated. The default value, if any, is given between parentheses.

    Typically, the following options will be changed by user, if any: hes, hdc, dgs, mpm, ren, urc The rest of options can be left as they are: they are aimed at professional reverse engineers.

    • rbr (1): hide bridge methods
    • rsy (0): hide synthetic class members
    • din (1): decompile inner classes
    • dc4 (1): collapse 1.4 class references
    • das (1): decompile assertions
    • hes (1): hide empty super invocation
    • hdc (1): hide empty default constructor
    • dgs (0): decompile generic signatures
    • ner (1): assume return not throwing exceptions
    • den (1): decompile enumerations
    • rgn (1): remove getClass() invocation, when it is part of a qualified new statement
    • lit (0): output numeric literals "as-is"
    • asc (0): encode non-ASCII characters in string and character literals as Unicode escapes
    • bto (1): interpret int 1 as boolean true (workaround to a compiler bug)
    • nns (0): allow for not set synthetic attribute (workaround to a compiler bug)
    • uto (1): consider nameless types as java.lang.Object (workaround to a compiler architecture flaw)
    • udv (1): reconstruct variable names from debug information, if present
    • ump (1): reconstruct parameter names from corresponding attributes, if present
    • rer (1): remove empty exception ranges
    • fdi (1): de-inline finally structures
    • mpm (0): maximum allowed processing time per decompiled method, in seconds. 0 means no upper limit
    • ren (0): rename ambiguous (resp. obfuscated) classes and class elements
    • urc (-): full name of a user-supplied class implementing IIdentifierRenamer interface. It is used to determine which class identifiers should be renamed and provides new identifier names (see "Renaming identifiers")
    • inn (1): check for IntelliJ IDEA-specific @NotNull annotation and remove inserted code if found
    • lac (0): decompile lambda expressions to anonymous classes
    • nls (0): define a new line character to be used for output. 0 - '\r\n' (Windows), 1 - '\n' (Unix), default is OS-dependent
    • ind: indentation string (default is 3 spaces)
    • crp (0): use record patterns where it is possible
    • cps (0): use switch with patterns where it is possible
    • log (INFO): a logging level, possible values are TRACE, INFO, WARN, ERROR
    • iec (0): include the entire classpath in context when decompiling
    • isl (1): inline simple lambda expressions
    • ucrc (1): hide unnecessary record constructor and getters
    • cci (1): check if resource in try-with-resources actually implements AutoCloseable interface
    • jvn (0): overwrite any local variable names with JAD style names
    • jpr (0): include parameter names in JAD naming
    • pbo (0): add clarifying parentheses when bitwise/shift operators are mixed with arithmetic
    Renaming identifiers

    Some obfuscators give classes and their member elements short, meaningless and above all ambiguous names. Recompiling of such code leads to a great number of conflicts. Therefore, it is advisable to let the decompiler rename elements in its turn, ensuring uniqueness of each identifier.

    Option ren (i.e. -ren=1) activates renaming functionality. The default renaming strategy goes as follows:

    • rename an element if its name is a reserved word or is shorter than 3 characters
    • new names are built according to a simple pattern: (class|method|field)_<consecutive unique number>
      You can overwrite these rules by providing your own implementation of the 4 key methods invoked by the decompiler while renaming. Simply pass a class that implements org.jetbrains.java.decompiler.main.extern.IMemberIdentifierRenamer in the option urc (e.g. -urc=com.example.MyRenamer) to Fernflower. The class must be available on the application classpath.

    The meaning of each method should be clear from naming: toBeRenamed determine whether the element will be renamed, while the other three provide new names for classes, methods and fields respectively.

    Development

    Build an executable start-up script:

    ./gradlew :installDist
    

    The startup script is generated in build/install/engine/bin.

    Contributing

    Fernflower is part of the IntelliJ Community project, contributions are welcome, the preferred way of sending patches is by creating a pull request in the IntelliJ community repository. When submitting patches, please follow the contribution guidelines.

    License

    Fernflower is licensed under the Apache License Version 2.0.

    Credits

    Fernflower was originally developed by Stiver but has been maintained by JetBrains since 2014. Some patches from ForgeFlower were merged into this repository. The mirror of Fernflower was also maintained by Andrew McRae for a very long time.

    Naming

    The correct name is Fernflower, not FernFlower.