反编译代码格式处理
- 背景
- 解决方案
- 程序跑之后
- 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
格式化后的。但是,实现起来好像有点复杂,看后续能不能实现