Java反编译工具

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信息。

相关推荐
学计算机的计算基9 分钟前
操作系统内存管理全解:虚拟内存、页表、COW、malloc、OOM一篇搞定
java·笔记·算法
tachibana214 分钟前
hot100 前 K 个高频元素(347)
java·数据结构·算法·leetcode
AOwhisky16 分钟前
Python 学习笔记(第五期)——组合数据类型:列表、元组、集合与字典精讲——核心知识点自测与详解
开发语言·笔记·python·学习·云计算
万亿少女的梦16833 分钟前
基于Spring Boot、Java与MySQL的网络订餐系统设计与实现
java·spring boot·mysql·系统设计·网络订餐
咩咩啃树皮9 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
灯澜忆梦9 小时前
GO_并发编程---定时器
开发语言·后端·golang
鱟鲥鳚9 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
-银雾鸢尾-10 小时前
C#中的StringBuilder相关方法
开发语言·c#
-银雾鸢尾-10 小时前
C#中结构体与类的区别;抽象类与接口的区别
开发语言·c#
大模型码小白11 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程