反編譯代碼格式處理
- 背景
- 解決方案
- 程序跑之后
- 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
格式化后的。但是,實現起來好像有點復雜,看后續能不能實現