我知道如何使用HashMaps
和东西将键映射到值。我只是想知道你是否也可以将键映射到方法。
例如,程序要求用户输入。然后它调用一个名称作为输入输入的方法。即:如果输入为"cat"
,则调用方法cat()
。
显然可以使用if语句,但有更简单的方法吗?
答案 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
}
现在,您可以调用方法的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();
}
答案 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()
。