I have a java code scenario where I have to populate the key and value entry in a HashMap. The key Id's I need to use are predefined and the corresponding value I generate via code logic processing something like this
Key=16 value= *result of method calculateZipWeather()*
Key=23 value= *result of method calculateZipCensus()*
key=37 value = *result of method calulateZipCrime()*
The way i do this today is something like this
String zipweather = calculateZipWeather()
mapObj.put(16,zipweather)
I wanted to check if there is a way to maintain static external mapping between key Id and the corresponding method name which populates it rather than hard coding key id in the java code.
Let me know your thoughts.
答案 0 :(得分:0)
这是您使用Reflection:
的方法假设您有以下包含所有'calculate'方法的类:
public class Operations {
public String calculateZipWeather() {
return "Zip Weather";
}
public String calculateZipCensus() {
return "Zip Census";
}
public String calculateZipCrime() {
return "Zip Crime";
}
}
接下来是你如何做你需要的(方法是java.lang.reflect.Method
):
public class Populate {
//This map contains mapping of your 'keys' with 'methods' which need to be invoked for those keys
private static Map<Integer, Method> keyOperationMapping;
//static initializer block to initialize the above map
static {
keyOperationMapping = new HashMap<Integer, Method>();
try {
//Getting the 'Method' object with method name as 'calculateZipWeather' from 'Operations' class and mapping it with key
Method method16 = Operations.class.getDeclaredMethod("calculateZipWeather");
keyOperationMapping.put(16, method16);
}
catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
}
try {
//Getting the 'Method' object with method name as 'calculateZipCensus' from 'Operations' class.
Method method23 = Operations.class.getDeclaredMethod("calculateZipCensus");
keyOperationMapping.put(16, method23);
}
catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
}
//Similary add more key-value pairs
}
public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
//You need an Operations object on which the methods will be called/invoked
Operations operations = new Operations();
//Map to store your results
Map<Integer, String> calculatedZips = new HashMap<Integer, String>();
//Iterate over all key-value pairs of key with methods
for(Map.Entry<Integer, Method> entry : keyOperationMapping.entrySet()) {
//Get method to be invoked
Method methodToInvoke = entry.getValue();
//Invoke the method on operations object, you can also pass arguments here if your method requires
String zipValue = (String) methodToInvoke.invoke(operations);
//Get key which will be your argum
int zipKey = entry.getKey();
calculatedZips.put(zipKey, zipValue);
}
}
}