有没有感觉你用java反编译工具jd-gui.exe后,得到源码是行号对不上的,如下面,这样的源码在debug起来很不方便,根本对不上,没有调试的价值
/* */ import org.dom4j.io.SAXReader;
/* */
/* */ public class ForHttpXMLAction extends HostAccessAction
/* */ {
/* 75 */ private String sendHeadFormatName = null;
/* */
/* 80 */ private String sendFormatName = "httpSendFormat";
/* */
/* 85 */ private String receiveFormatName = "httpReceiveFormat";
/* */
/* 90 */ private String receiveHeadFormatName = null;
/* */
/* 95 */ private int timeOut = 0;
/* */
/* 100 */ private String serviceName = null;
/* */
/* 105 */ private String urlEncoding = "ISO8859-1";
/* */
/* 110 */ private String encoding = "GBK";
/* */
/* 115 */ private String inputFeild = null;
/* */
/* 120 */ private String outputFeild = null;
/* */
/* 125 */ private String chanlTradNo = null;
/* */
但是幸好的是,上面的行号的注释,比如这样“/* 115* /”
为了方便用eclipse的调试debug,我写了一个程序,来格式式行号,使上面的行号按照注释的对齐,这样调试起来特别方便
你只需要把jd-gui.exe反编译生成的源码目录传到main方法即可,下面代码就会生成一个与源代码平级同名+bak的文件,话不多说,直接看代码
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.apache.logging.log4j.core.helpers.FileUtils;
public class FormatSrc {
public static void main(String[] args) throws Exception {
doFo("H:/work/src/7sdfasdf");
}
private static String common = null;
public static void doFo(String path) {
List<File> javaFile = getJavaFile(path);
for (File file : javaFile) {
doCreateFile(file, path);
}
}
public static void doCreateFile(File file, String distDir) {
String absolutePath = file.getAbsolutePath();
Map<Integer, String> map = doFill(format(absolutePath));
List<Integer> keyList = new ArrayList<Integer>(map.keySet());
Collections.sort(keyList);
// (file.getPath());
// file.deleteOnExit();
String p1 = absolutePath.substring(0, distDir.substring(0, distDir.lastIndexOf("/")).length());
String p2 = absolutePath.substring(distDir.length() , absolutePath.length());
if (common == null) {
common = distDir.subSequence(distDir.lastIndexOf("/"), distDir.length()) + "-bak";
}
String path = p1 + "/" + common + "/" + p2;
File distFile = new File(path);
try {
org.apache.commons.io.FileUtils.forceDeleteOnExit(distFile.getParentFile());
if (!distFile.exists()) {
distFile.getParentFile().mkdirs();
}
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} finally {
}
Writer out = null;
BufferedWriter bw = null;
try {
out = new FileWriter(distFile);
bw = new BufferedWriter(out);
for (Integer key : keyList) {
bw.write(key + map.get(key));
bw.newLine();
bw.flush();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (bw != null) {
try {
bw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
public static Integer getLastKey(Set<Integer> keySet) {
if (keySet == null || keySet.size() == 0) {
return 0;
}
List<Integer> list = new ArrayList<Integer>(keySet);
Collections.sort(list);
Collections.reverse(list);
return list.get(0);
}
public static List<File> getJavaFile(String dir) {
List<File> javaFiles = new ArrayList<File>();
File file = new File(dir);
if (file.exists()) {
File[] list = file.listFiles();
if (list != null && list.length > 0) {
for (File f : list) {
if (f.isFile() && f.getName().lastIndexOf(".java") != -1) {
javaFiles.add(f);
} else {
List<File> javaFile = getJavaFile(f.getAbsolutePath());
if (javaFile != null) {
javaFiles.addAll(javaFile);
}
}
}
}
}
return javaFiles;
}
public static Map<Integer, String> doFill(Map<Integer, String> map) {
Map<Integer, String> _map = new Hashtable<Integer, String>();
Set<Integer> keySet = map.keySet();
int up;
int distance;
for (Integer i : keySet) {
if (i > 1) {
up = getLastKey(_map.keySet());
if (i - up > 1) {
for (int j = up + 1; j <= i - 1; j++) {
_map.put(j, "#");
}
} else {
_map.put(i, map.get(i));
}
} else {
_map.put(i, map.get(i));
}
}
return _map;
}
public static Map<Integer, String> format(String path) {
Map<Integer, String> map = new Hashtable<Integer, String>();
File file = new File(path);
Reader in = null;
BufferedReader br = null;
String oneLine = null;
String lineNum = null;
String _lineNum = null;
String lineCode = null;
boolean b = false;
boolean a = false;
try {
in = new FileReader(file);
br = new BufferedReader(in);
// /* 19 */ private static Map cacheMap = new HashMap();
int i = 1;
while ((oneLine = br.readLine()) != null && oneLine != "") {
if (StringUtils.isNotBlank(oneLine)) {
if (oneLine.lastIndexOf("*/") == -1) {
map.put(i, oneLine);
i++;
b = true;
if (oneLine.indexOf("Location:") != -1) {
break;
}
} else {
if (oneLine.indexOf("Location:") != -1) {
break;
}
_lineNum = oneLine.split("\\*/")[0];
lineNum = _lineNum.substring(2, _lineNum.length() - 1);
lineCode = oneLine.substring(_lineNum.length() + 2, oneLine.length());
lineCode = lineCode == "" ? "#" : lineCode;
if (StringUtils.isBlank(lineNum)) {
Integer lastKey = getLastKey(map.keySet());
lastKey = lastKey == null ? 0 : lastKey;
map.put(lastKey + 1, lineCode);
} else {
map.put(Integer.valueOf(StringUtils.trim(lineNum)), lineCode);
}
}
// (oneLine + " " + lineNum + " " + lineCode);
} else {
// ("---->" + oneLine + "<--------" +
// lineNum);
if (oneLine.indexOf("Location:") != -1) {
b = true;
a = true;
}
if (b && a) {
break;
} else {
map.put(i, oneLine);
i++;
}
}
}
if (oneLine == "" && a) {
map.put(i, oneLine);
i++;
}
// i = 1;
} catch (Exception e) {
System.out.println("----->" + oneLine + "<--------");
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
return map;
}
}