在java中更改动态调用的方法的名称

时间:2017-11-16 18:16:15

标签: java methods dynamic

我有一个对象" JudgesSubmission"使用以下方法:

public String getInnovationGrade1() {
    return innovationGrade1;
}
public String getInnovationGrade2() {
    return innovationGrade2;
}
public String getInnovationGrade3() {
    return innovationGrade3;
}
public String getInnovationGrade4() {
    return innovationGrade4;
}

现在,在调用这些方法时,我想将它们放在一个循环中,其中被调用的方法名称获取附加到其末尾的循环的索引,从而更改所调用的方法。这可能吗? 例如,以下代码永远不会起作用,但我正在编写它以解释我需要的内容:

judgesSubmission metricScores= new judgesSubmission;
int metricSum=0;
for (int i=0;i<4;i++){
metricSum=metricSum
      Integer.parseInt(metricScores.getInnovationGrade+"i"());
}

有没有办法做到这一点,还是我总是写出完整的方法名称?

2 个答案:

答案 0 :(得分:2)

你想做的事情是不可能的......但是反思如下:

MyObject.class.getMethod("mymethod"+i);

如果没有反思,您可以使用Supplier<String>

public void process(Supplier<String>... suppliers){

    judgesSubmission metricScores= new judgesSubmission;
    int metricSum=0;
    for (Supplier<String> supplier : suppliers){
          Integer.parseInt(supplier.get());
    }
}

并将其称为:

MyObject myObject = new MyObject();
process(()->myObject.getInnovationGrade1(), 
    ()->myObject.getInnovationGrade2(),
    ()->myObject.getInnovationGrade3(),
    ()->myObject.getInnovationGrade4());

答案 1 :(得分:2)

没有reflection(强烈不推荐)

是不可能的

相反,您可能想要使用其他方法:

  1. 数据数组(替换4种方法,或另外)

    one_d_pixel_vals =  np.array([0.3, 0.4, 1.3, 3.4, 4.5, 4.2, 2.8, 2.4, 1.4, 0.1])
    print(one_d_pixel_vals)
    
    plt.plot(one_d_pixel_vals)
    plt.yticks(np.arange(5))
    plt.xticks(np.arange(9))
    plt.grid(True)
    plt.show()
    
    one_d_fft = np.fft.fft(one_d_pixel_vals, norm='ortho')
    print(one_d_fft)
    print(len(one_d_fft))
    
    >>> [ 6.57753753 +0.00000000e+00j -3.27588825 -6.42423464e-01j
    0.01065311 +6.25512087e-01j  0.22429031 -4.34214340e-01j
    0.25814049 -7.06019011e-02j -0.06324555 -1.12346671e-15j
    0.25814049 +7.06019011e-02j  0.22429031 +4.34214340e-01j
    0.01065311 -6.25512087e-01j -3.27588825 +6.42423464e-01j]
    10
    
    • 然后您可以使用

      String[] getInnovationGrades()
      {
          return new String[]{innovationGrade1, innovationGrade2, innovationGrade3, innovationGrade4};
      }
      
  2. 获取所需数据的参数

    for(String innovationGrade : getInnovationGrades())
        //do stuff
    
    • 然后您可以使用

      String getInnovationGrade(int i)
      {
          switch(i)
          {
              case 1:
                  return getInnovationGrade1();
              case 2:
                  return getInnovationGrade2();
              case 3:
                  return getInnovationGrade3();
              case 4:
                  return getInnovationGrade4();
              default:
                  return ""; //or throw exception, depends on how you wish to handle errors
          }
      }