按参数名称获取正确的构造函数

时间:2014-07-04 00:36:53

标签: java reflection

我尝试使用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方法的情况下解决这个问题?

0 个答案:

没有答案