Java在循环中动态更改函数名称

时间:2012-08-31 07:27:09

标签: java

我在一个类中定义了5个函数。在另一个类中,我有一个多循环结构,它尝试计算我的每个上述函数在包含许多字符串的输入文件上所花费的时间。

我想要输出,使得对于输入文件的每个条目,计算并打印出每个函数在10个调用中所花费的平均时间。所以,输出应该像 -

inputString | function1AvgTime | f2AvgTime等等。

我无法想出一个优雅的方法来为单个输入字符串分别调用所有这5个函数10次。现在我似乎正在做的是这个 -

    for (inputString):
         for (iteration 1 to 10):
             call function 1
         for (iteration 1 to 10):
             call function2
    and so on....

有没有办法将函数名存储在数组或某个数据结构中,并在单个迭代循环中调用它们?无论如何,我的工作正在完成。如果有更好的设计,我只是好奇。

2 个答案:

答案 0 :(得分:4)

您可能希望查看反射:http://java.sun.com/developer/technicalArticles/ALT/Reflection/

它允许您检查类的成员并调用您想要的成员。特别是,请查看上面链接中的“按名称调用方法”部分。

答案 1 :(得分:4)

使用Runnable界面

void runMultipleTimes(Runnable run, int times) {
    for (int i = 0; i < times; i++) {
        run.run();
    }
}

然后使用匿名本地类来包装各个函数,即

runMultipleTimes(new Runnable() {
    @Override
    void run() {
        function1();
    }
}, 10 /* how often to run */);

这与Java API有些一致。 Runnable是Java在整个地方使用的关键接口。与此同时,我相信它通常只执行一次。因此,您可以确保它可以多次运行!

但到目前为止,除了将for存储在集合中的能力之外,你在显式Runnable循环上获得的收益并不多:

for (Runnable run : runCollection) {
    runMultipleTimes(run, 100);
}

如果你想避免自己编写Runnable,你可以使用Java反射来通过String名称获取方法,甚至可以通过完全自省。基本上,您然后编写执行一个Runnable一个 java.lang.reflect.Method。 Runnable方法更灵活,因为您还可以执行以下操作:

runCollection.add(new Runnable() {
    @Override
    void run() {
        function(123456);
    }
});

runCollection.add(new Runnable() {
    @Override
    void run() {
        function(654321);
    }
});

使用不同的参数运行相同的函数。