java - 动态调用非静态方法

标签 java

我有几十个功能,它们可以相互替代。它们接受一个输入并返回一个输出,但在每种情况下输出都略有不同。所有这些都嵌入在一个包装类中。

我想通过将方法名称作为字符串传递来调用它们。我还想避免手动维护大量不需要的 if 语句:

if(methodName.equals("method1")
    return method1(argument);
...
else if(methodName.equals("method176")
    return method176(argument);

到目前为止,我已经想出了如何动态调用方法,但前提是方法是静态的:

try {
    method = MyMainClass.class.getDeclaredMethod(methodName, MyArgumentClass.class);
    ResultClass result = (ResultClass)method.invoke(null, myArgument);
    return result;
}
catch(Exception e)
{
    e.printStackTrace();
    System.exit(1);
    return null;
}

对于非静态方法,是否可以在类实例而不是静态类上调用函数?

最佳答案

是的。使用 Java reflection只需将要调用的实例作为 invoke 方法的第一个参数传递即可。

阅读:http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Method.html#invoke

try {
    MyArgumentClass argument = new MyArgumentClass();
    MyMainClass instance = new MyMainClass(argument);
    method = MyMainClass.class.getDeclaredMethod(methodName, MyArgumentClass.class);
    ResultClass result = (ResultClass) method.invoke(instance, myArgument);
    return result;
}
catch(Exception e)
{
    e.printStackTrace();
    System.exit(1);
    return null;
}

正如其他答案中所指出的,这不是解决您的问题的最佳方法。你应该实现 the Strategy pattern像这样:

interface MyOperation{
   public ResultClass execute(MyArgumentClass argument);
}

public class Method1 implements MyOperation {
    public ResultClass execute(MyArgumentClass argument){
      ....
    }
}

public class Method176 implements MyOperation {
    public ResultClass execute(MyArgumentClass argument){
      ....
    }
}

public class DoIt{
    public ResultClass doIt(MyOperation method, MyArgumentClass argument){
       return method.doIt(argument);
    }
}

关于java - 动态调用非静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9334278/

相关文章:

java - 放心 Java : How to get header user and pass from setup method

java - 在java或jsp中将数字转换为百万和十亿格式

java - 在单个类中实现 Function 和 Buffer 是个好主意吗?

java - 为什么 GUI 不以观察者模式更新?

java - 如何设置Jbutton的颜色

java - 根据属性值从单个对象列表重建列表

java - 如何自定义 JFrame 的标题栏?

java - Tomcat内部是如何创建线程的?

java - 在 GAE/J 上创建文件并上传到 Google 文档

java - 为什么要使用 Char 而不是 String?