如何从类中调用静态方法,只要你只有类的字符串名称(和方法名称/参数) - 在Java中

时间:2016-03-04 15:51:04

标签: java oop methods

我想创建一个可以被各种不同的类调用的静态方法。所有调用此方法的类都有一个名为“evaluate”的方法,我想从方法中调用它。

所涉及的所有类和方法都是静态的。然而,“评估”方法在具有它的每个类中实现不同。如何从每次调用方法的特定类中调用evaluate方法?

谢谢!

这是psudeo代码/更多信息

我的项目的目标是对任意数量的sig-figs实现Newton和Bisection近似方法

特别关于二分法 - 它应该能够使用任何可评估的函数

这不是一个理想的方法,但由于我的任务框架(高中老师),我的每个不同的功能都嵌入了

静态类,作为名为“evaluate”的单个方法。

二分法依赖于能够一遍又一遍地调用evaluate方法来查找零。我希望能够调用每个特定类的

从单独的二分法中评估。

评估类的示例:

//evaluate the function x^2+5x+3
public class Problem1{
 public void main(String[] args){
   //code here

   //call bisectionMethod() here

  }

  //various other methods

  //the one that i'm concerned about
  public static double evaluate(double input){
    //return output for x^2+5x+3
  }

}  //several classes like this, with different functions


public class Bisection{

  //filler methods


  //this one:
  public static double[] bisectionMethod(){  //don't know if it should have inputs - it has to be able to figure out which eval it's using
    //do the bisection method
    call evaluate(double input) here
  }
}

3 个答案:

答案 0 :(得分:3)

这是一个限制,你不能将静态方法放入接口。解决方法是使用Java Reflection API:

public Object callStaticEvaluate(Class<?> clazz, double input) throws Exception {
    return clazz.getMethod("evaluate", double.class).invoke(null, input);
}

What is reflection and why is it useful?

答案 1 :(得分:2)

鉴于Java 8语法,除了使用接口和反射之外还有第三种方法:

Bisection

import java.util.function.DoubleUnaryOperator;

public class Bisection {

  public static double[] bisectionMethod(DoubleUnaryOperator evalFn, <other args>)
    // invoke the function
    double in  = ...;
    double out = fn.applyAsDouble(in);
    ...
  }
}   

并使用静态评估函数的方法句柄调用Bisection

Bisection.bisectionMethod(Problem1::evaluate)

答案 2 :(得分:1)

你不能通过任何干净的方式做到这一点.OOP不支持任何这样的结构。你必须使用反射。 Invoking a static method using reflection

所以它会是 -

public static <T extends XXX> void evaluate(Class<T> c){
        // invoke static method on c using reflection
    }