将键映射到Java中的方法

时间:2013-11-02 06:13:43

标签: java

我知道如何使用HashMaps和东西将键映射到值。我只是想知道你是否也可以将键映射到方法。

例如,程序要求用户输入。然后它调用一个名称作为输入输入的方法。即:如果输入为"cat",则调用方法cat()

显然可以使用if语句,但有更简单的方法吗?

6 个答案:

答案 0 :(得分:2)

获取方法并调用它。

java.lang.reflect.Method method = class_obj.getClass().getMethod("functionName"); // add params if any
method.invoke(); // add params if any

这相当于调用函数

functionName(void);

这适用于必须不传递参数的情况。

答案 1 :(得分:1)

您可以创建Map几乎任何东西。你的场景当然是一个非正统的应用程序。

但如果你坚持,你可以这样做:

Map<String, Method> map = new HashMap<>(); //Java 7
Method[] methods = ClassToMap.class.getDeclaredMethods() //First link 
for(Method m : methods) {
  map.put(m.getName(), m);  //Second link
}

请参阅herehere

现在,您可以调用方法的Map个方法名称 - 尽管您需要使用Method API来调用它们。

答案 2 :(得分:1)

public class Test {
  public static void main(String[] args) throws Exception {
    String name = args[0];
    Method method = Test.class.getDeclaredMethod(name, new Class[]{});
    method.invoke(null, new Object[]{});
  }

  public static void method1() {
    System.out.println("in method1()");
  }

  public static void method2() {
    System.out.println("in method2()");
  }
}

答案 3 :(得分:1)

您应该使用一个方法(或使用Runnable)创建一个接口,并在单独的类中实现每个可调用方法,而不是尝试调用特定方法(这不是面向对象的方法)。然后将这些类的实例放入map并在匹配对象上调用实现的方法:

Map<String, Runnable> myMap = new HashMap<String, Runnable>();
// fill myMap with your objects
String input = ...; // get user input

if (myMap.containsKey(input)) {
    myMap.get(input).run();
}

另请参阅strategy design pattern

答案 4 :(得分:1)

您可以使用Java Reflection API执行此操作。这是一个基本的例子,虽然在实践中你应该使你的异常捕获逻辑更高级:

public class JavaDynamicMethodsExample {

    public void cat() {
        System.out.println("Meow!");
    }

    public void dog() {
        System.out.println("Bark!");
    }

    public void bird() {
        System.out.println("Chirp!");
    }

    public void callMethod(String methodName) {
        try {
            Method method = this.getClass().getMethod(methodName);
            method.invoke(this);
        } catch (Exception e) {
            System.out.println("Could not call method with name: " + methodName);
        }
    }


    public static void main(String [] args) {

        JavaDynamicMethodsExample example = new JavaDynamicMethodsExample();

        String [] methods = {"cat", "dog", "hamster", "bird"};

        for(String methodName : methods) {
            example.callMethod(methodName);
        }

    }
}

这将输出:

  

喵!

     

树皮!

     

无法使用名称调用方法:hamster

     

啁啾!

答案 5 :(得分:-1)

您可以将字符串添加到Method

例如,在您的情况下,您可以执行以下操作:

String k = "cat"

String caller(String key)
{
    String ret = null;
    if (key.equals(k)) 
    {
    ret = cat();
    }
    return ret;
}

String cat() {}

因此,每次将用户的输入传递给caller()函数时,都会调用方法cat()