【问题标题】:java Hashmap mapping key id to method namesjava Hashmap 将键 ID 映射到方法名称
【发布时间】:2016-07-24 07:49:45
【问题描述】:

我有一个 java 代码场景,我必须在 HashMap 中填充键和值条目。 我需要使用的键 ID 是预定义的,并且我通过代码逻辑处理生成的相应值是这样的

Key=16 value= *result of method calculateZipWeather()*
Key=23 value= *result of method calculateZipCensus()*
key=37 value = *result of method calulateZipCrime()*

我今天的做法是这样的

String zipweather = calculateZipWeather()  
mapObj.put(16,zipweather)

我想检查是否有办法维护键 ID 和填充它的相应方法名称之间的静态外部映射,而不是在 Java 代码中硬编码键 ID。

让我知道你的想法。

【问题讨论】:

  • 使用反射将键值映射到方法名称(或Method对象)。

标签: java dictionary hashmap mapping


【解决方案1】:

这是使用反射的方法:

假设您有以下包含所有“计算”方法的类:

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

    }

}

【讨论】: