我正在尝试使用Java中的反射在Sample Model类中调用方法process
。该方法接受字符串和字符串的映射并返回相同的东西,字符串和字符串的映射。
下面是我的代码,但不知怎的,它每次都给我一个例外。
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
答案 0 :(得分:2)
您的方法不是静态的,因此您需要在调用invoke
时提供实例。
SampleModel instanceOfYourClass = ...// get an instance
Object o = m.invoke(instanceOfYourClass, test);
如果方法为null
,您只能将invoke
传递给static
来电。阅读解释此here的javadoc。
答案 1 :(得分:2)
如果m.invoke(null, test)
抛出NullPointerException
,则process
方法很可能不是静态的。
如果您无法更改该方法的签名,则应将SampleModel
的实例传递给m.invoke
而不是null
。
假设SampleModel
构造函数是公共的并且没有参数,并且您不需要任何实例本身,例如:
m.invoke(new SampleModel(), test);