使用HashMap创建动态函数调用

时间:2014-03-12 04:44:07

标签: java hashmap

我正在尝试使用hashmap创建一个函数调用。    
例如,

  

Hashmap-- "a" -> "b" "c" -> "d"

现在我应该解析这个Hashmap并创建一个这样的函数 -

someFun("{a:#,c:#}",new SomeClass(b),new SomeClass(d));

如您所见,ac是hashmap(第一个参数)的键;
bd用于创建对象(第二个论证等等..)
someFun参数取决于HashMap大小..

我很困惑!
因为我可以遍历地图来获取Keys并轻松创建第一个参数。
对于第二个参数,我可以使用该值来创建对象 但是现在如何将这些添加到一起以使指定的函数调用?
非常感谢任何帮助:)

  

P.S:我的问题不是从hashmap获取值/键,而是使用它们创建一个函数调用指定的东西。我不允许更改someFun将其视为API调用。

4 个答案:

答案 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
    }
}