问题: Java中获得了方法名称的字符串,怎么样调用该方法
如果我有以下两个变量
Object obj;
String methodName = "getName";
在不知道obj的类的情况下,我怎么样才能调用该类的名叫methodName的方法呢?
这个方法被调用时不带参数,并且返回的是一个字符串,这是一个Javabean的getter方法
回答一
java.lang.reflect.Method method;
try {method = obj.getClass().getMethod(methodName, param1.class, param2.class, ..);
} catch (SecurityException e) { ... }catch (NoSuchMethodException e) { ... }
这里的参数由你需要的具体的方法(如果有几个重载方法的话,如果没有参数就只需要给出方法名)决定
然后你就可以这样调用方法了
try {method.invoke(obj, arg1, arg2,...);
} catch (IllegalArgumentException e) { ... }catch (IllegalAccessException e) { ... }catch (InvocationTargetException e) { ... }
再次声明,如果你这个方法没有参数,就忽略arg1,arg2.
回答二
通过反射实现方法的调用:
Class<?> c = Class.forName("class name");
Method method = c.getDeclaredMethod("method name", parameterTypes);
method.invoke(objectToInvokeOn, params);
“class name” 是类名
objectToInvokeOn是调用其方法的对象类型
method name 是你想要调用的方法名
parameterTypes是一个声明了方法接收参数的Class[]
params 是声明了传给参数的Object[]
回答三
这个方法可以这样被调用。可能会有更多的选择(查一下反射的APi吧),但是这个是最简单的
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;import org.junit.Assert;
import org.junit.Test;public class ReflectionTest {private String methodName = "length";private String valueObject = "Some object";@Testpublic void testGetMethod() throws SecurityException, NoSuchMethodException, IllegalArgumentException,IllegalAccessException, InvocationTargetException {Method m = valueObject.getClass().getMethod(methodName, new Class[] {});Object ret = m.invoke(valueObject, new Object[] {});Assert.assertEquals(11, ret);}}
回答四
首先,请避免这种代码的的顺序。它真的是很差的并且也不安全。(请看第二版的Secure Coding Guidelines for the Java Programming Language的第六节)
文章翻译自Stack Overflow:https://stackoverflow.com/questions/160970/how-do-i-invoke-a-java-method-when-given-the-method-name-as-a-string