简体   繁体   中英

java Hashmap mapping key id to method names

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM