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.
This is how you can do it using Reflection:
Suppose you have following class which contains all the 'calculate' methods:
public class Operations {
public String calculateZipWeather() {
return "Zip Weather";
}
public String calculateZipCensus() {
return "Zip Census";
}
public String calculateZipCrime() {
return "Zip Crime";
}
}
Then following is how you do what you need (Method is 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);
}
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.