【问题标题】:Calling Methods Names from a List of Strings从字符串列表中调用方法名称
【发布时间】:2014-05-03 13:23:35
【问题描述】:

我有一个这样的字符串:

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.

【问题讨论】:

  • result.get(Name).FirstMethod 是对字段的访问,而不是方法。你的意思是result.get(Name).FirstMethod()
  • 你想调用方法或者获取result.get(Name)对象中某个字段的值?
  • 哈哈好吧,它在 Eclipse 上出现了一个蓝色三角形 - 所以我认为这是一种方法。我将使用我调用它的类来编辑上面的内容
  • “result.get(Name)”的结果是一个 ControlService.RegisterValues 类型的实例。这种类型真的声明了这么多方法吗?或者名称数组是否可以包含许多相同的方法名称?但是,尽管如此,您正在尝试的事情可以通过反射来实现。
  • 我添加了调用它的方法。抱歉,我不太擅长行话(目前)

标签: java string list maps


【解决方案1】:

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

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

关于您是否真的在访问一个字段,您的问题有点模棱两可。如果是这种情况,您可以通过Class.getField 获取Field,并通过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[] names 循环中的String 变量。您也可以将上述作为单行:

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

【讨论】:

  • 我不太清楚从方法中获取字段的语法。我试过result.get(Name).getField()result.getField()
  • 结果首先输入为整数,我用新字段编辑了问题
  • 我更新了我的答案以显示它们是如何组合在一起的。顺便说一句,您应该研究 Java 命名约定;您发布的代码不遵循标准约定。变量(包括字段)应以小写字母开头(firstMethod 而不是 FirstMethodname 而不是 Name)。
【解决方案2】:
Class.getMethod(methodName).invoke(....);

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

【讨论】:

    【解决方案3】:
         //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);
          }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-27
      • 2012-07-09
      • 2023-03-15
      • 2015-10-29
      • 1970-01-01
      • 1970-01-01
      • 2013-01-23
      • 1970-01-01
      相关资源
      最近更新 更多