JD-Core
最高支持到java12,项目最近更新是4年前。
fernflower
intellij内置反编译工具。最近有更新。反编译后的文件没有包名目录。
java -jar fernflower.jar -lit=0 test.jar ./test
-rbr (1): 隐藏桥接方法
-rsy (0): 隐藏合成的类成员
-din (1): 反编译内部类
-dc4 (1): 折叠 1.4 类引用
-das (1): 反编译断言
-hes (1): 隐藏空的 super 调用
-hdc (1): 隐藏空的默认构造函数
-dgs (0): 反编译泛型签名
-ner (1): 假设返回不会抛出异常
-den (1): 反编译枚举
-rgn (1): 当 getClass() 调用是限定 new 语句的一部分时移除它
-lit (0): 按原样输出数字字面值
-asc (0): 将字符串和字符字面值中的非 ASCII 字符编码为 Unicode 转义字符
-bto (1): 将 int 1 解释为 boolean true(编译器错误的解决方法)
-nns (0): 允许未设置合成属性(编译器错误的解决方法)
-uto (1): 将无名类型视为 java.lang.Object(编译器架构缺陷的解决方法)
-udv (1): 如果存在,重构调试信息中的变量名
-ump (1): 如果存在,重构对应属性的参数名
-rer (1): 移除空的异常范围
-fdi (1): 内联 finally 结构
-mpm (0): 每个反编译方法的最大允许处理时间(以秒为单位)。0 表示没有上限
-ren (0): 重命名模糊(即混淆的)类和类元素
-urc (-): 实现 IIdentifierRenamer 接口的用户提供类的全名。用于确定哪些类标识符应重命名并提供新标识符名称(请参阅“重命名标识符”)
-inn (1): 检查 IntelliJ IDEA 特定的 @NotNull 注释并移除插入的代码(如果发现)
-lac (0): 将 lambda 表达式反编译为匿名类
-nls (0): 定义用于输出的新行字符。0 - '\r\n'(Windows),1 - '\n'(Unix),默认是操作系统相关
-ind: 缩进字符串(默认是 3 个空格)
-crp (0): 尽可能使用记录模式
-cps (0): 尽可能使用带模式的 switch
-log (INFO): 日志级别,可能的值有 TRACE, INFO, WARN, ERROR
cfr
cfr最近更新2年前。工具可以在java6已经更高环境运行。最高支持java14的反编译。
java -jar cfr-0.152.jar InnerClass.class
--aexagg: (布尔值)
--aexagg2: (布尔值)
--aggressivedocopy: (int >= 0) 默认值:0
--aggressivedoextension: (布尔值)
--aggressiveduff: (布尔值)
--aggressivesizethreshold: (int >= 0) 默认值:13000
--allowcorrecting: (布尔值) 默认值:true
--allowmalformedswitch: (布尔值)
--analyseas: (DETECT、JAR、WAR、CLASS 之一)
--antiobf: (布尔值) 默认值:false
--arrayiter: (布尔值) 默认值:如果 class 文件版本为 49.0 (Java 5) 或更高则为 true
--caseinsensitivefs: (布尔值) 默认值:true
--clobber: (布尔值)
--collectioniter: (布尔值) 默认值:如果 class 文件版本为 49.0 (Java 5) 或更高则为 true
--commentmonitors: (布尔值) 默认值:false
--comments: (布尔值) 默认值:true
--constobf: (布尔值) 默认值:与 antiobf 参数相同
--decodeenumswitch: (布尔值) 默认值:如果 class 文件版本为 49.0 (Java 5) 或更高则为 true
--decodefinally: (布尔值) 默认值:true
--decodelambdas: (布尔值) 默认值:如果 class 文件版本为 52.0 (Java 8) 或更高则为 true
--decodestringswitch: (布尔值) 默认值:如果 class 文件版本为 51.0 (Java 7) 或更高则为 true
--dumpclasspath: (布尔值) 默认值:false
--eclipse: (布尔值) 默认值:true
--elidescala: (布尔值) 默认值:false
--extraclasspath: (字符串)
--forbidanonymousclasses: (布尔值) 默认值:false
--forbidmethodscopedclasses: (布尔值) 默认值:false
--forceclassfilever: (字符串,指定 java 版本如 'j6', 'j1.0',或 class 文件版本如 '56', '56.65535')
--forcecondpropagate: (布尔值)
--forceexceptionprune: (布尔值)
--forcereturningifs: (布尔值)
--forcetopsort: (布尔值)
--forcetopsortaggress: (布尔值)
--forcetopsortnopull: (布尔值)
--forloopaggcapture: (布尔值)
--hidebridgemethods: (布尔值) 默认值:与 obfattr 参数相同
--hidelangimports: (布尔值) 默认值:true
--hidelongstrings: (布尔值) 默认值:false
--hideutf: (布尔值) 默认值:true
--ignoreexceptions: (布尔值) 默认值:false
--ignoreexceptionsalways: (布尔值) 默认值:false
--importfilter: (字符串)
--innerclasses: (布尔值) 默认值:true
--instanceofpattern: (布尔值) 默认值:如果 class 文件版本为 60.0 (Java 16) 或更高,或在 58.0 (Java 14)、59.0 (Java 15) 中为实验性则为 true
--j14classobj: (布尔值) 默认值:如果 class 文件版本为 49.0 (Java 5) 或更高则为 false
--jarfilter: (字符串)
--labelledblocks: (布尔值) 默认值:true
--lenient: (布尔值) 默认值:false
--liftconstructorinit: (布尔值) 默认值:true
--lomem: (布尔值) 默认值:false
--methodname: (字符串)
--obfattr: (布尔值) 默认值:与 antiobf 参数相同
--obfcontrol: (布尔值) 默认值:与 antiobf 参数相同
--obfuscationpath: (字符串)
--outputdir: (字符串)
--outputencoding: (字符串)
--outputpath: (字符串)
--override: (布尔值) 默认值:如果 class 文件版本为 50.0 (Java 6) 或更高则为 true
--previewfeatures: (布尔值) 默认值:true
--pullcodecase: (布尔值) 默认值:false
--recordtypes: (布尔值) 默认值:如果 class 文件版本为 60.0 (Java 16) 或更高,或在 58.0 (Java 14)、59.0 (Java 15) 中为实验性则为 true
--recover: (布尔值) 默认值:true
--recovertypeclash: (布尔值)
--recovertypehints: (布尔值)
--reducecondscope: (布尔值)
--relinkconst: (布尔值) 默认值:true
--relinkconststring: (布尔值) 默认值:与 relinkconst 参数相同
--removebadgenerics: (布尔值) 默认值:true
--removeboilerplate: (布尔值) 默认值:true
--removedeadconditionals: (布尔值)
--removedeadmethods: (布尔值) 默认值:true
--removeinnerclasssynthetics: (布尔值) 默认值:true
--rename: (布尔值) 默认值:false
--renamedupmembers: (布尔值) 默认值:与 rename 参数相同
--renameenumidents: (布尔值) 默认值:与 rename 参数相同
--renameillegalidents: (布尔值) 默认值:与 rename 参数相同
--renamesmallmembers: (int >= 0) 默认值:0
--sealed: (布尔值) 默认值:如果 class 文件版本为 62.0 (Java 18) 或更高,或在 60.0 (Java 16)、61.0 (Java 17) 中为实验性则为 true
--showinferrable: (布尔值) 默认值:如果 class 文件版本为 51.0 (Java 7) 或更高则为 false
--showversion: (布尔值) 默认值:true
--silent: (布尔值) 默认值:false
--skipbatchinnerclasses: (布尔值) 默认值:true
--staticinitreturn: (布尔值) 默认值:true
--stringbuffer: (布尔值) 默认值:如果 class 文件版本为 49.0 (Java 5) 或更高则为 false
--stringbuilder: (布尔值) 默认值:如果 class 文件版本为 49.0 (Java 5) 或更高则为 true
--stringconcat: (布尔值) 默认值:如果 class 文件版本为 53.0 (Java 9) 或更高则为 true
--sugarasserts: (布尔值) 默认值:true
--sugarboxing: (布尔值) 默认值:true
--sugarenums: (布尔值) 默认值:如果 class 文件版本为 49.0 (Java 5) 或更高则为 true
--sugarretrolambda: (布尔值) 默认值:false
--switchexpression: (布尔值) 默认值:如果 class 文件版本为 58.0 (Java 14) 或更高,或在 56.0 (Java 12)、57.0 (Java 13) 中为实验性则为 true
--tidymonitors: (布尔值) 默认值:true
--trackbytecodeloc: (布尔值) 默认值:false
--tryresources: (布尔值) 默认值:如果 class 文件版本为 51.0 (Java 7) 或更高则为 true
--usenametable: (布尔值) 默认值:true
--usesignatures: (布尔值) 默认值:true
--version: (布尔值) 默认值:true
--help: (字符串)
如何在反编译后的文件中显示,class文件中LineNumberTable信息。