2014-03-12 24 views
0

我想用hashmap創建一個函數調用。
例如,
使用HashMap創建動態函數調用

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

現在我應該解析這個HashMap和創建像這個 -

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

的功能正如你所看到的,ac是hashmap的鍵(第一個參數);
bd用於創建對象(第二個參數等..)
someFun參數取決於HashMap的大小..

我很困惑!
因爲我可以遍歷地圖來獲取Keys並輕鬆創建第一個參數。
對於第二個參數,我可以使用該值來創建對象。
但現在如何將這些添加到一起,使指定的函數調用?
任何幫助將是非常讚賞:)

PS:我的問題是不是正從HashMap中值/鍵,但用它們來創建一個函數調用的東西如specified.I我不可以改變someFun將其視爲API調用。

+0

你的問題不明確!你想調用一個函數,而不是從'Hashmap'中檢索特定鍵的值。是它嗎??? – Dileep

+0

要進行函數調用,您必須使用java反射api。 – Hirak

+0

http://stackoverflow.com/questions/10462819/get-keys-from-hashmap-in-java你不需要解析一個hasmap。只需使用keyset()函數即可獲取所有密鑰並根據需要創建一個字符串。 – ray

回答

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); 
} 

} 
+0

謝謝!我錯過了通用參數需要數組:/悲傷! – Yash

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); 
    } 

剩下的就是你的邏輯,你可以在你想要的任何地方使用的值。

+0

謝謝,我知道如何獲取值/keys.I需要使用動態參數 – Yash

+0

進行函數調用,您說您需要HashMap鍵和值來創建函數調用。 – Dileep

+0

請具體說明您的要求。 – Dileep

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 
    } 
} 
+0

這是一個記事本類型的代碼。請期待幾個編譯錯誤和修改... – Hirak

+0

謝謝,但該方法的參數數量不固定,我需要根據散列映射的大小來決定它們 – Yash

+0

這不應該是一個問題。讓你的someFun方法接受可變參數。 getMethod和apis的調用都接受可變參數。 – Hirak

1

首先,你應該定義功能像這樣:

public void someFun(String str, SomeClass[] someClasses) { 
    // do something 
} 

或者這樣:

public void someFun(String str, SomeClass... someClass) { 
    // do something 
} 

前者會更好,因爲它很容易通過Java反射調用它。

然後通過hashmap並將所有密鑰集中爲字符串someString作爲第一個參數。在進行迭代時,將所有值放入數組someClasses作爲第二個參數。

最後得到的方法,並通過調用它(假設我們使用SomeObject someObject調用函數)。

Method method = SomeObject.getClass().getMethod("someFun"); 
method.invoke(someObject, new Object[] {someString, someClasses}); 
+0

謝謝!說得通! – Yash