我尝试使用reflect通过json配置创建一些实例:
config.json:
{
"clazz":com.kk.Manager",
"args":{
"path":"/home/kk/a.txt",
"scale":1
}
}
实现:
packge com.kk;
public class Manager{
private File file;
private int scale;
public Manager(String path,int scale){
this.file = new File(path)
this.scale=scale;
//other initialization work omitted
}
}
private static Object buildObject(String clazz, JSONObject args) {
Object instance;
try {
Class clas = Class.forName(clazz);
if (args == null) {
instance = clas.newInstance();
} else {
Class[] pamas = new Class[args.length()];
Object[] vals = new Object[args.length()];
Iterator<String> parameterIt = args.keys();
int i = 0;
while (parameterIt.hasNext()) {
String fd = parameterIt.next();
Object val = args.get(fd);
pamas[i] = val.getClass();
vals[i] = val;
i++;
}
instance = clas.getConstructor(pamas).newInstance(vals);
}
return instance;
} catch (Exception e) {
return null;
}
return null;
}
解析json配置文件后,我会这样称呼它:
String clazz = parent.getString("clazz");
JSONObject args = parent.getJSONObject("args")
buildObject(clazz,args);
代码抛出错误:
java.lang.NoSuchMethodException: com.kk.Manager.<init>(java.lang.Integer, java.lang.String)
似乎Manager
的构造函数使用错误的顺序调用。
google之后,似乎JSONObject中的键顺序未定义。
所以我想知道我是否可以通过参数名称来获取构造函数,例如:
Class cls = Class.forName(clazz);
cls.getConstructor("path","scale");
如果没有,如何在不添加setter方法的情况下解决这个问题?