Java在循环中动态更改函数名
我在一个类中定义了5个函数。在另一个类中,我有一个多循环结构,它尝试在包含许多字符串的输入文件上计算上述每个函数所花费的时间 我希望输出的结果是,对于输入文件的每个条目,计算并打印出每个函数在10次调用中所花费的平均时间。因此,输出应该类似于- 输入字符串|函数1avgtime | f2AvgTime等 我想不出一个优雅的方法来为一个输入字符串调用这5个函数10次。现在我似乎在做的是-Java在循环中动态更改函数名,java,Java,我在一个类中定义了5个函数。在另一个类中,我有一个多循环结构,它尝试在包含许多字符串的输入文件上计算上述每个函数所花费的时间 我希望输出的结果是,对于输入文件的每个条目,计算并打印出每个函数在10次调用中所花费的平均时间。因此,输出应该类似于- 输入字符串|函数1avgtime | f2AvgTime等 我想不出一个优雅的方法来为一个输入字符串调用这5个函数10次。现在我似乎在做的是- for (inputString): for (iteration 1 to 10)
for (inputString):
for (iteration 1 to 10):
call function 1
for (iteration 1 to 10):
call function2
and so on....
有没有办法将函数名存储在数组或某些数据结构中,并在单个迭代循环中调用它们?不管怎样,我的工作正在完成。我只是好奇是否有更好的设计 您可能需要查看反射:
它允许您检查类的成员并调用所需的成员。特别是,请查看上面链接中的“按名称调用方法”部分。您可能希望查看反射:
它允许您检查类的成员并调用所需的成员。特别是,请查看上面链接中的“按名称调用方法”部分。使用
Runnable
界面
void runMultipleTimes(Runnable run, int times) {
for (int i = 0; i < times; i++) {
run.run();
}
}
这在某种程度上符合JavaAPIRunnable
是Java在各地使用的关键接口。同时,我相信它通常只执行一次。因此,由您来确保它可以运行多次
但到目前为止,除了在集合中存储Runnable
s之外,显式的for
循环并没有给您带来太多好处:
for (Runnable run : runCollection) {
runMultipleTimes(run, 100);
}
如果您想避免自己编写Runnable
s,您可以使用Java反射通过String
name,甚至通过完全自省来获取方法。基本上,您将编写一个Runnable
,执行一个java.lang.reflect.Method
。Runnable方法更加灵活,因为您还可以执行以下操作:
runCollection.add(new Runnable() {
@Override
void run() {
function(123456);
}
});
runCollection.add(new Runnable() {
@Override
void run() {
function(654321);
}
});
使用不同的参数运行相同的函数。使用
Runnable
界面
void runMultipleTimes(Runnable run, int times) {
for (int i = 0; i < times; i++) {
run.run();
}
}
这在某种程度上符合JavaAPIRunnable
是Java在各地使用的关键接口。同时,我相信它通常只执行一次。因此,由您来确保它可以运行多次
但到目前为止,除了在集合中存储Runnable
s之外,显式的for
循环并没有给您带来太多好处:
for (Runnable run : runCollection) {
runMultipleTimes(run, 100);
}
如果您想避免自己编写Runnable
s,您可以使用Java反射通过String
name,甚至通过完全自省来获取方法。基本上,您将编写一个Runnable
,执行一个java.lang.reflect.Method
。Runnable方法更加灵活,因为您还可以执行以下操作:
runCollection.add(new Runnable() {
@Override
void run() {
function(123456);
}
});
runCollection.add(new Runnable() {
@Override
void run() {
function(654321);
}
});
用不同的参数运行相同的函数。这正是我想要的。我同意——我写反射代码时总是眯着一只眼睛,感觉不好。它对于编写一些不需要编写boileplate的基本自动化测试非常有用。对“数组或某些数据结构中的函数名,并在单个迭代循环中调用它们?”的字面回答是“反射”。“好奇是否有更好的设计”-Runnable。出于这些原因,我将+1@anonymousse的答案;)这正是我想要的。我同意——我总是用一只眼睛斜视和一种不好的直觉来编写反射代码。它对于编写一些不需要编写boileplate的基本自动化测试非常有用。对“数组或某些数据结构中的函数名,并在单个迭代循环中调用它们?”的字面回答是“反射”。“好奇是否有更好的设计”-Runnable。出于这些原因,我将+1@anonymousse的答案;)+1对于
Runnable
建议,比我的答案(我将删除)要好。不过,我要重申我对任何基于反射的解决方案的厌恶。这就是我在这里强调字符串的原因。使用反射本质上意味着通过字符串而不是字节码引用方法。为什么我添加了带有参数的示例(并且将参数传递给通过反射获得的方法真的很麻烦)。+1对于Runnable
建议,比我的答案(我将删除它)要好。不过,我要重申我对任何基于反射的解决方案的厌恶。这就是我在这里强调字符串的原因。使用反射本质上意味着通过字符串而不是字节码引用方法。以及为什么我添加了带有参数的示例(并且将参数传递给通过反射获得的方法真的很麻烦)。