0

我正在尝试process使用 Java 中的反射调用示例模型类中的方法。该方法接受字符串和字符串的映射并返回相同的内容,即字符串和字符串的映射。

下面是我的代码,但不知何故,它每次都给我一个例外。

Map<String, String> test = new LinkedHashMap<String, String>();
try {

    test.put("CGUID", "ABCD");
    test.put("RESOURCEINDEX", "XYZ");

    Method m = SampleModel.class.getDeclaredMethod("process", Map.class);
    Object o = m.invoke(null, test);

}

这条线-总是Object o = m.invoke(null, test);给我Null Pointer Exception

谁能帮我在这里做错了什么?

以下是方法签名-

@Override
public Map<String, String> process(final Map<String, String> attributes) {

    Map<String, String> newData = new LinkedHashMap<String, String>();

    for (Map.Entry<String, String> entry : attributes.entrySet()) {
        StringBuilder sb =  new StringBuilder();
        sb.append(entry.getValue()).append("$$$$").append(UUID.randomUUID().toString());
        newData.put(entry.getKey(), sb.toString());
    }

    return newData;
}

更新:-

    Class<SampleModel> consClass = SampleModel.class;
            Map<String, String> test = new LinkedHashMap<String, String>();
            try {

                test.put("CGUID", "ABCD");
                test.put("RESOURCEINDEX", "XYZ");

                Method m = SampleModel.class.getDeclaredMethod("process", Map.class);
                Object o = m.invoke(consClass, test);
}

上面的代码也不行?它给了我例外——

object is not an instance of declaring class

4

2 回答 2

2

如果m.invoke(null, test)throws NullPointerException,该process方法很可能不是静态的。

如果您无法更改该方法的签名,则应传递SampleModeltom.invoke而不是null.

假设SampleModel构造函数是公共的并且没有参数,并且您不需要实例本身来做任何事情,如下所示:

m.invoke(new SampleModel(), test);
于 2013-08-27T19:09:11.480 回答
2

您的方法不是静态的,因此您需要在调用时提供一个实例invoke

SampleModel instanceOfYourClass = ...// get an instance
Object o = m.invoke(instanceOfYourClass, test);

如果方法是,您只能传递nullinvoke调用static在此处阅读解释此内容的 javadoc 。

于 2013-08-27T19:06:54.503 回答