如何从 Java 中的给定字符串调用方法
How to call a method from a given string in Java
我正在尝试减少我的代码使用一堆 if 语句来获取指定的命令并为其调用方法。
相反,我想尝试一些可以接受该命令并使用它调用方法名称的东西
像这样:
"get" + commandString + "Count"()
而不是:
if (command == "something") {
callSomeMethod();
}
if (command == "somethingelse") {
callSomeOtherMethod();
}
...
有没有办法从指定的字符串中调用方法?或者更好的方法来解决这个问题。
这是 switch case 语句的 use-case。
switch(command){
case "command1": command1(); break;
case "command2": command2(); break;
幸运的是,在 Java 中不可能使用字符串 javascript 样式。评论链接到如何使用反射来完成类似的事情的答案。这很少是一个好的解决方案。
我们可以使用
java.lang.reflect.Method
Something like
java.lang.reflect.Method method;
try {
method = obj.getClass().getMethod(methodName, param1.class, param2.class, ..);
} catch (SecurityException e) { ... }
catch (NoSuchMethodException e) { ... }
参数标识您需要的非常具体的方法(如果有多个重载可用,如果方法没有参数,则只提供方法名称)。
您可能的解决方案可能是 -
package com.test.pkg;
public class MethodClass {
public int getFishCount() {
return 5;
}
public int getRiceCount() {
return 100;
}
public int getVegetableCount() {
return 50;
}
}
package com.test.pkg;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) {
MethodClass classObj = new MethodClass();
Method method;
String commandString = "Fish";
try {
String methodName = "get" + commandString + "Count";
method = classObj.getClass().getMethod(methodName);
System.out.println(method.invoke(classObj)); //equivalent to System.out.println(testObj.getFishCount());
} catch (SecurityException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
}
参考:How do I invoke a Java method when given the method name as a string?
我正在尝试减少我的代码使用一堆 if 语句来获取指定的命令并为其调用方法。
相反,我想尝试一些可以接受该命令并使用它调用方法名称的东西
像这样:
"get" + commandString + "Count"()
而不是:
if (command == "something") {
callSomeMethod();
}
if (command == "somethingelse") {
callSomeOtherMethod();
}
...
有没有办法从指定的字符串中调用方法?或者更好的方法来解决这个问题。
这是 switch case 语句的 use-case。
switch(command){
case "command1": command1(); break;
case "command2": command2(); break;
幸运的是,在 Java 中不可能使用字符串 javascript 样式。评论链接到如何使用反射来完成类似的事情的答案。这很少是一个好的解决方案。
我们可以使用
java.lang.reflect.Method Something like
java.lang.reflect.Method method;
try {
method = obj.getClass().getMethod(methodName, param1.class, param2.class, ..);
} catch (SecurityException e) { ... }
catch (NoSuchMethodException e) { ... }
参数标识您需要的非常具体的方法(如果有多个重载可用,如果方法没有参数,则只提供方法名称)。
您可能的解决方案可能是 -
package com.test.pkg;
public class MethodClass {
public int getFishCount() {
return 5;
}
public int getRiceCount() {
return 100;
}
public int getVegetableCount() {
return 50;
}
}
package com.test.pkg;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) {
MethodClass classObj = new MethodClass();
Method method;
String commandString = "Fish";
try {
String methodName = "get" + commandString + "Count";
method = classObj.getClass().getMethod(methodName);
System.out.println(method.invoke(classObj)); //equivalent to System.out.println(testObj.getFishCount());
} catch (SecurityException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
}
参考:How do I invoke a Java method when given the method name as a string?