java Hashmap mapping key id to method names

时间:2016-04-04 16:41:53

标签: java dictionary hashmap mapping

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.

1 个答案:

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

    }

}