反编译代码格式处理
- 背景
- 解决方案
- 程序跑之后
- idea格式化
- 总结
背景
想看看公司里一个工具的代码实现,手里只有一个jar
包,只能通过jd-gui
反编译代码。但是呢,源码是有了,但是看的很难受。
解决方案
/*** 替换 {@code searchDir}中所有remark信息,以及空行 用于解决源码反编译处理费代码* @param searchDir*/
public static void removeRemarkLine(String searchDir){File directory = new File(searchDir);if (directory.isDirectory()) {File[] files = directory.listFiles();if (files != null) {for (File file : files) {if (file.isDirectory()) {removeRemarkLine(file.getAbsolutePath());} else if (file.getName().endsWith(".java")) {removeCommentsAndEmptyLines(file.getAbsolutePath());}}}}
}public static void removeCommentsAndEmptyLines(String filePath) {try {List<String> modifiedLines = new ArrayList<>();BufferedReader reader = new BufferedReader(new FileReader(filePath));String line;StringBuilder sb = new StringBuilder();boolean commentStart = false;while ((line = reader.readLine()) != null) {sb.setLength(0);// 每一行逐个字符匹配, 碰到 /* 标记注释开头 碰到 */ 丢弃范围内的东西for (int i=0; i<line.length(); i++){if (line.charAt(i) == '/' && i != line.length() - 1 && line.charAt(i+1) == '*'){commentStart = true;i++;continue;}if (commentStart && line.charAt(i) == '/' && i != 0 && line.charAt(i-1) == '*'){commentStart = false;continue;}if (!commentStart){sb.append(line.charAt(i));}}line = sb.toString();if (line.trim().isEmpty()){continue;}
// modifiedLines.add(line.trim());modifiedLines.add(line);}reader.close();BufferedWriter writer = new BufferedWriter(new FileWriter(filePath));for (String modifiedLine : modifiedLines) {writer.write(modifiedLine);writer.newLine();}writer.close();} catch (IOException e) {e.printStackTrace();}
}
试了一下,基本没啥问题。能看了,但是呢,和
idea
格式化后的感觉还是有点差异。
程序跑之后
idea格式化
总结
只能看,但还是想看
idea
格式化后的。但是,实现起来好像有点复杂,看后续能不能实现