Java invoke class 调用里面的方法

Java invoke class to call method inside

我有问题。在我的代码中,我有以下行:

HashMap<String, String> strategyResponse = strategy_005.run(runDateTimeLocal);

这个函数在strategy_005里面 class:

public class strategy_005 {

    public static HashMap<String, String> run(Integer i) {

        HashMap<String, String> output = new HashMap<>();
        output.put("Response", i.toString());
        return output;

    }

}

我不是在 strategy_005 class 中调用函数,而是在我的 MainClass 中调用函数。我遇到的问题是 class 中的 005 部分是动态的,所以我有多个 class 从 strategy_001strategy_015.

这是我的代码 MainClass:

public class MainClass {

    public static void main(String[] args) {

        for (int i = 1; i <= 15; i++) {
            
            // Call every "strategy_0(i)" run() method
            HashMap<String, String> strategyResponse = strategy_005.run(i);
            System.out.println(strategyResponse.get("Response"));

        }

    }

}

我知道如何按名称从 class 调用方法,但我不知道如何调用 class 然后调用我知道的方法。我发现的唯一接近我想要的是: Creating an instance using the class name and calling constructor

不幸的是,这个主题是关于调用构造函数的,但我想调用一个自定义方法。 请让我知道如何实现!

所以我要做的是尝试制作一个 Strategy 抽象 class,然后从 Strategy 扩展所有 0 到 15。然后在Strategy.java

中做一个方法
public static HashMap<String, String> run( ? extends Strategy, Integer i ) {
    Strategy.getResponse() ...
}

? extends Strategy 表示 Strategy 的任何子 class(在本例中为 Strats 0-15) 然后你会在 main 中构造它并调用

Strategy.run( strategyResponse, i)

我尝试按照我在这里所说的进行操作,但无法正确编译。相反,我做了一个虚拟 class 来玩:

public class Strategies< T extends AbstractStrategy >
{
    ArrayList<? extends AbstractStrategy> li = new ArrayList<>() ;
    
    public HashMap<String,String> run( Strategies<?> strat ) 
    {
        HashMap<String,String> map = new HashMap<>() ;
        return map ;
    }
    
}

这两个都可以编译,因此您可以稍微调整一下语法,使其符合您的喜好和用法。

您可以使用 reflection:

调用方法
public HashMap<String, String> invoke(int i, int arg0){
    Class<?> clz = Class.forName("package_name.strategy_" + i);
    Method method = clz.getDeclaredMethod("run", int.class);
    return (HashMap<String, String>) method.invoke(null, arg0);
}

for(int i = 0; i < 15; i++){
    HashMap<String, String> output = invoke(i, runDateTimeLocal);
}

Class.forName("package_name.strategy_" + i); 的 class 的名称必须完全符合包名