我知道如何使用HashMaps
和东西将键映射到值。我只是想知道您是否也可以将键映射到方法。
例如,一个程序要求用户输入。然后它调用一个方法,其名称作为输入的输入。即:如果输入为"cat"
,cat()
则调用方法。
显然可以使用 if 语句,但有没有更简单的方法?
我知道如何使用HashMaps
和东西将键映射到值。我只是想知道您是否也可以将键映射到方法。
例如,一个程序要求用户输入。然后它调用一个方法,其名称作为输入的输入。即:如果输入为"cat"
,cat()
则调用方法。
显然可以使用 if 语句,但有没有更简单的方法?
获取方法并调用它。
java.lang.reflect.Method method = class_obj.getClass().getMethod("functionName"); // add params if any
method.invoke(); // add params if any
这相当于调用函数
functionName(void);
这适用于您不必传递任何参数的情况。
您可以使用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);
}
}
}
这将输出:
喵!
吠!
无法使用名称调用方法:仓鼠
啁啾!
你可以创建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
方法名称,然后你可以调用它们——尽管你需要使用Method
API 来调用它们。
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()");
}
}
与其尝试调用特定方法(这不是面向对象的方法),不如使用一个方法(或 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();
}
另请参阅策略设计模式。
你可以做字符串到Method
.
例如,在您的情况下,您可以执行以下操作:
String k = "cat"
String caller(String key)
{
String ret = null;
if (key.equals(k))
{
ret = cat();
}
return ret;
}
String cat() {}
因此,每次您将用户的输入传递给caller()
函数时,cat()
都会调用方法。