从字符串列表中调用方法名称

时间:2014-03-25 15:24:13

标签: java string list maps

我有一个字符串:

String[] names = new String[] {"FirstMethod", "SecondMethod"...} //200 of these

目前我必须手动输入:

public void onSuccess( Map<String,ControlService.RegisterValues> result ) {

    for( String Name : result.keySet() ){

        message+=result.get(Name).FirstMethod+", ";
        message+=result.get(Name).SecondMethod+", ";
        //I call the method here - I'd like to use the list above to call it in though

显然我不想输入200次,有没有办法可以使用这个列表,将其转换为方法名称,并循环显示?

编辑:

我正在通过以下方式调用它:

public interface ControlService extends RemoteJsonService
{

public void I2CRegisterValues( String [] Names, AsyncCallback<Map<String,RegisterValues>> callback); 

public class RegisterValues
{
    int FirstMethod;
    //etc.

3 个答案:

答案 0 :(得分:1)

Class.getMethod(methodName).invoke(....);

有关详细信息,请参阅API:http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html

答案 1 :(得分:1)

您可以使用Class.getMethod访问方法,该方法返回Method个对象。然后通过传递实例和参数来调用该Method对象:

method.invoke(result.get(Name), whateverArguments);

关于您是否真正访问字段,您的问题有点含糊不清。如果是这种情况,您可以通过Field获取Class.getField,并通过get方法获取其值,再次传入您要获取字段。

在任何一种情况下,结果都输入为Object,您需要将其向下转换为预期类型。对于像int这样的原语,返回的对象将是一个类似Integer的盒装类型,您可以将其自动取消装箱到int

int foo = (Integer) method.invoke(...);

整个事情看起来像是:

Field field = I2CRegisterValues.getField(fieldName);
Object o = field.get(result.get(Name));
int fieldValue = (Integer) o;

...其中fieldNameString循环中的String[] names变量。您也可以将上述内容作为一行:

int fieldValue = (Integer) I2CRegisterValues
    .getField(fieldName)
    .get(result.get(Name));

答案 2 :(得分:0)

     //load desired Class at runtime
  Class classObj = Class.forName("xyz.abc.YourClassName");
  Object obj = classObj .newInstance();

 //invoke specific method at runtime
     for( String methodName : result.keySet() ){
       Method method = cls.getDeclaredMethod(methodName , noparams);
       method.invoke(obj, null);
      }