0

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

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

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

4

6 回答 6

2

获取方法并调用它。

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

这相当于调用函数

functionName(void);

这适用于您不必传递任何参数的情况。

于 2013-11-02T06:23:57.603 回答
1

您可以使用Java 反射 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);
        }
    
    }
}

这将输出:

喵!

吠!

无法使用名称调用方法:仓鼠

啁啾!

于 2013-11-02T06:43:18.917 回答
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
}

这里这里

现在你有了一个Map方法名称,然后你可以调用它们——尽管你需要使用MethodAPI 来调用它们。

于 2013-11-02T06:26:35.157 回答
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()");
  }
}
于 2013-11-02T06:35:39.210 回答
1

与其尝试调用特定方法(这不是面向对象的方法),不如使用一个方法(或 use 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();
}

另请参阅策略设计模式

于 2013-11-02T06:39:39.210 回答
-1

你可以做字符串到Method.

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

String k = "cat"

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

String cat() {}

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

于 2013-11-02T06:19:29.453 回答