Java中获得了方法名称的字符串,怎么样调用该方法| Java Debug 笔记

199 阅读1分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接

问题: 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";

    @Test
    public 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:stackoverflow.com/questions/1…