java反编译jar包
- 在日常开发中,由于之前的系统中UDF函数源码并没有接手,要想把现有UDF函数一直到其他平台上使用,因此需要对现有jar包进行反编译,并在其他平台上调试使用。
- 反编译方式分两种:
- GUI工具(JD-GUI)
- idea插件:java-decompiler.jar
GUI工具
- 使用反编译GUI工具,这种工具可以直接打开jar包,并将反编译之后的结果导出
- 反编译的结果文件入下(附带一下其他东西,还得手工处理一下):
package com.alibaba.fastjson.support.odps.udf;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONPath;
import com.alibaba.fastjson.parser.Feature;
import com.alibaba.fastjson.parser.ParserConfig;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.aliyun.odps.udf.UDF;
public class JSONArrayAddObject extends UDF {
public JSONArrayAddObject() {
JSON.DEFAULT_PARSER_FEATURE |= Feature.OrderedField.ordinal();
SerializeConfig.getGlobalInstance().setAsmEnable(false);
ParserConfig.getGlobalInstance().setAsmEnable(false);
}
public String evaluate(String jsonString, String value) {
JSONArray jsonArray;
try {
jsonArray = JSON.parseArray(jsonString);
} catch (Exception ex) {
ex.printStackTrace();
return jsonString;
}
addObject(jsonArray, value);
return JSON.toJSONString(jsonArray);
}
public String evaluate(String jsonString, String path, String... values) {
Object rootObject;
JSONArray jsonArray;
try {
rootObject = JSON.parse(jsonString);
jsonArray = (JSONArray)JSONPath.eval(rootObject, path);
} catch (Exception ex) {
ex.printStackTrace();
return jsonString;
}
for (String value : values) {
addObject(jsonArray, value);
}
return JSON.toJSONString(rootObject);
}
protected void addObject(JSONArray jsonArray, String v1) {
try {
Object jsonValue = JSON.parse(v1);
jsonArray.add(jsonValue);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
IDEA插件java-decompiler
- 使用前先安装plugnis:java-decompiler
- 执行命令:
java -cp "D:\apps\JetBrains\IntelliJ IDEA Community Edition 2018.1.4\plugins\java-decompiler\lib\java-decompiler.jar" org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -dgs=true fastjson-odps.jar fastjson-odps
- 最后的参数是数据目录,目录需要先创建出来
- 到这里基本就反编译成功了,接下来就是代码调试了