我正在尝试使用hashmap创建一个函数调用。
例如,
Hashmap-- "a" -> "b" "c" -> "d"
现在我应该解析这个Hashmap并创建一个这样的函数 -
someFun("{a:#,c:#}",new SomeClass(b),new SomeClass(d));
如您所见,a
和c
是hashmap(第一个参数)的键;
b
和d
用于创建对象(第二个论证等等..)
someFun
参数取决于HashMap大小..
我很困惑!
因为我可以遍历地图来获取Keys并轻松创建第一个参数。
对于第二个参数,我可以使用该值来创建对象
但是现在如何将这些添加到一起以使指定的函数调用?
非常感谢任何帮助:)
P.S:我的问题不是从hashmap获取值/键,而是使用它们创建一个函数调用指定的东西。我不允许更改
someFun
将其视为API调用。
答案 0 :(得分:2)
是这样的吗,你需要:
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map.Entry;
public class Draft {
public static class SomeClass{
final private String val;
public SomeClass(String val) {
this.val = val;
}
}
public void someFun(String str, SomeClass ... classes) {
System.out.println("someFun" + str + Arrays.toString(classes));
}
public static void main(String[] args) {
HashMap<String, String> keyToParam = new HashMap<>();
keyToParam.put("a", "b");
keyToParam.put("c", "d");
String strArg = null;
SomeClass[] classes = new SomeClass[keyToParam.size()];
int pointer = 0;
for(Entry<String, String> entry: keyToParam.entrySet()) {
strArg += entry.getKey() + ":#";
classes[pointer++] = new SomeClass(entry.getValue());
}
new Draft().someFun(strArg, classes);
}
}
答案 1 :(得分:1)
首先,你应该定义这样的函数:
public void someFun(String str, SomeClass[] someClasses) {
// do something
}
或者这个:
public void someFun(String str, SomeClass... someClass) {
// do something
}
前者会更好,因为Java Reflection很容易调用它。
然后浏览散列映射并将所有键集中到字符串someString
作为第一个参数。在进行迭代时,将所有值放入数组someClasses
作为第二个参数。
最后获取方法并调用它(假设我们使用SomeObject someObject
来调用函数):
Method method = SomeObject.getClass().getMethod("someFun");
method.invoke(someObject, new Object[] {someString, someClasses});
答案 2 :(得分:0)
获取HapsMap
键值
HashMap<Object, Object> hashMap= new HashMap<Object,Object>();
...
Set<Object> keyValueSet=hashMap.keySet();
for ( Object keyValue : keyValueSet) {
//you get the key from keyValue and the corresponding value from hashMap using this
hashMap.get(keyValue);
}
其余的是你的逻辑,你可以在你想要的任何地方使用这些值。
答案 3 :(得分:0)
试试这种方式......
try {
Object obj = new Object();// Create a new instance of the class that contain your method.
Method m = obj.getClass().getMethod("methodName", param1.class, param2.class, ..);
// In your case Method m = obj.getClass().getMethod("someFun", String.class,SomeClass.class,SomeClass.class);
m.invoke(obj, "{a:#,c:#}", new SomeClass(b),new SomeClass(d));
}catch (SecurityException e) {
// ...
} catch (NoSuchMethodException e) {
// ...
}catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
} catch (InvocationTargetException e) {
}
方法实施:
public static void someFun(String name, SomeClass classes ...) {
for (SomeClass cls : classes) {
//Logic here
}
}