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_001
到 strategy_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 的名称必须完全符合包名
我有问题。在我的代码中,我有以下行:
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_001
到 strategy_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 的名称必须完全符合包名