从文本文件中读取方法并在程序中执行它们

时间:2014-12-08 08:15:34

标签: java oop object file-io

我有一个文本文件,该文件列出了可以在Pump Class上执行的所有操作。

文本文件内容的示例

 Start PayCredit Reject Start PayCredit Reject TurnOff
 ....
 .... so on.

这些是Pump类的方法(Start(),Reject()等)

我需要编写一个代码,我可以逐个从文件中读取这些方法并执行它们。

public static void main(String[] args) throws IOException
{

    Pump gp= new Pump();
    File file=new File("C:\\Users\\Desktop\\checker\\check.txt"); 
    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
    String line=null;
    while((line=br.readLine())!=null)
    {
        String words[]=line.split(" ");
        for(int i=0;i<words.length;i++)
        {
            String temp=words[i]+"()";
            gp.temp; //compilation error
        }
    }

}

您能告诉我如何实现此功能。

5 个答案:

答案 0 :(得分:1)

如果您对反射不太熟悉,可以尝试使用Spring Framework项目中的org.springframework.util.ReflectionUtils吗?

代码会是这样的:

Pump gp = new Pump();
....
String temp = // from text file
....
Method m = ReflectionUtils.findMethod(Pump.class, temp);
Object result = ReflectionUtils.invokeMethod(m, gp);

答案 1 :(得分:1)

您需要使用反射来在运行时调用方法。这是一个假设所有方法都不带任何参数的简单示例。

Class<? extends Pump> pumpClass = gp.getClass();
String methodName = words[i];
Method toInvoke = pumpClass.getMethod(methodName);
if (null != toInvoke) {
    toInvoke.invoke(gp);
}

答案 2 :(得分:0)

首先要知道Java不是在运行时解释的。所以你不能这样做。

如果您已经拥有Start PayCredit Reject TurnOff等方法,您可以通过以下方式进行:

for(int i=0;i<words.length;i++)
{
    String temp=words[i];
    if (temp.equals("Start") gp.Start();
    else if (temp.equals("PayCredit") gp.PayCredit();
    ...
}

答案 3 :(得分:0)

使用开关盒

for(int i=0;i<words.length;i++) {
    String temp=words[i];
    switch(temp) {
        case "Start":
            gp.start();
            break;
        case "PayCredit":
            gp.PayCredit();
            break;
    }
}

答案 4 :(得分:0)

您可以使用反射来执行此操作,例如

String line=null;
Method method = null;

while((line=br.readLine())!=null)
{
    String words[]=line.split(" ");
    for(int i=0;i<words.length;i++)
    {
        String temp=words[i];
        method = getClass().getMethod(temp);
        method.invoke(this);
    }
}

假设您想要在此处调用该方法,并且它是一个实例方法。有关详细信息,请查看Class.getMethod及相关方法以及Method本身。您可能需要getDeclaredMethod,您可能需要使其可访问。

如果可能的话,我会想到你是否可以想到避免这种情况的方法 - 反思往往会很快变得混乱。值得退后一步并考虑这是否是最好的设计。如果您向我们提供更多详细信息,我们可能会建议替代方案。