当前位置: 首页 > 知识库问答 >
问题:

如何在Java中按名称(字符串)调用方法?

裴良弼
2023-03-14

A的每个实例都有一个类B的实例。A应该根据其成员变量method_num调用B中的不同方法。这是一个实现,做我想要的:

public class A {
    private B myB = new B();
    public int method_num = 1;
    public callBMethod() {
        if ( method_num == 1 )
            myB.method1();
        else
            myB.method2();
    }
}

public class B {
    public method1() { }
    public method2() { }
}

但是,我希望能够以某种方式直接传递B的方法1或方法2,而不是执行myA.method_num=1。我怎么能那样做?

共有3个答案

钱嘉致
2023-03-14

我认为你可以像这样使用反射

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) {  //do proper handling
} catch (IllegalAccessException e) {//do proper handling
} catch (InvocationTargetException e) {//do proper handling
党祖鹤
2023-03-14

你不能。Java没有将函数视为第一类对象,因为它没有Python或C#等功能特性。

您可以创建命令界面并传递该对象引用:

public interface Command {
    void execute(Object [] args);
}
越勇锐
2023-03-14

如果您不想使用反射(这是一个很好的目标),那么enums中有一些简洁的功能,允许您将enum设置为代理。

public class A {
  private B myB = new B();
  public int method_num = 1;

  public void callBMethod() {
    // Could do it by name.
    BMethods.valueOf("method1").call(myB);
    // Or by number.
    BMethods.values()[method_num].call(myB);
  }

}

enum BMethods{
  method1 {
    @Override
    public void call(B b) {
      b.method1();
    }
  },
  method2 {
    @Override
    public void call(B b) {
      b.method2();
    }
  };

  public abstract void call (B b);
}

public class B {
  public void method1() {
  }

  public void method2() {
  }

}
 类似资料:
  • 问题内容: 如何通过反射找出方法的字符串名称是什么? 例如给出: 我想获取字符串“ getFoo”,如下所示: 问题答案: 由于方法本身不是对象,因此它们没有直接的属性(就像您希望使用JavaScript之类的一流函数那样)。 您能做的最接近的是致电 是一个对象,您可以使用它调用任何反射方法。 但是,据我所知,一种方法无法识别自己。

  • 问题内容: 如果我有两个变量: 在不知道的类的情况下obj,如何调用由其标识的方法methodName? 被调用的方法没有参数,并且有String返回值。 问题答案: 参数标识你需要的非常特定的方法(如果有多个重载可用,如果该方法没有参数,则仅给出methodName)。 然后,你通过调用该方法 同样,.invoke如果没有,请忽略中的参数。

  • 问题内容: 示例代码: 现在,说我想让用户输入一个字符串: 然后,说出用户输入。我将如何检索命名的变量并对其进行处理?像这样: 我抬头看了一些东西,却没发现太多。我确实找到了对“反射API”的引用,但是对于这一简单任务而言,它似乎太复杂了。 有没有办法做到这一点,如果是的话,那是什么?如果“反射”确实有效并且是唯一的方法,那么我将如何使用它来做到这一点?它的教程页面包含了各种我无法理解的内部内容。

  • 问题内容: 我有一个元组,列出了像这样的类的方法: 等等.. 现在,我需要根据用户做出的选择动态调用这些方法。该方法将基于索引被调用。因此,如果用户选择“ 0”,则称为,如果“ 5”,则称为。 我这样做的方法如下: 我设法解决了一些问题,但是会产生错误并且一点也不优雅。 问题答案: 如果要在对象(包括导入的模块)上调用方法,则可以使用: 例如: 如果您需要在当前模块中调用函数 要发送的参数列表或元

  • 问题内容: 我有一个str对象,例如:。我想从此字符串运行安装方法。例如,当我打电话时它将呼叫。有什么办法吗? 问题答案: 如果在课程中,则可以使用getattr: 或者它是一个函数:

  • 问题内容: 我有一个包含变量名称的字符串。我想获取该变量的值。 是否有可能访问该值使用? 问题答案: 我建议您改用: 通过执行操作创建地图 然后改变 至 并使用访问值