Learner
Learner

Reputation: 459

Read methods from a text file and execute them in the program

I have a text file and that file lists all the operations that can be performed on a Pump Class.

example of the content of text file

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

These are the methods of the Pump class(Start(), Reject() etc)

I need to write a code where I can Read these method from the file one by one and execute them.

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
        }
    }

}

Could you tell me how can I achieve this functionality.

Upvotes: 1

Views: 1984

Answers (5)

mkobit
mkobit

Reputation: 47269

You would need to use reflection to invoke the methods at runtime. Here is a simple example that assumes that all methods do not take any parameters.

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

Upvotes: 1

Stewart
Stewart

Reputation: 18304

If you're not so familiar with reflection, maybe try using org.springframework.util.ReflectionUtils from the Spring Framework project?

The code would go something like this:

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

Upvotes: 1

Vaibhav Bhootna
Vaibhav Bhootna

Reputation: 176

You can use reflection to do this, e.g.

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);
    }
}

That's assuming you want to call the method on this, of course, and that it's an instance method. Look at Class.getMethod and related methods, along with Method itself, for more details. You may want getDeclaredMethod instead, and you may need to make it accessible.

I would see if you can think of a way of avoiding this if possible though - reflection tends to get messy quickly. It's worth taking a step back and considering if this is the best design. If you give us more details of the bigger picture, we may be able to suggest alternatives.

Upvotes: 0

Assaf
Assaf

Reputation: 1370

use a switch case

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

Upvotes: 0

Adil Aliyev
Adil Aliyev

Reputation: 1169

First of all be aware that Java is not interpreted at runtime. So you can't do it this way.

If you already have the methods such as Start PayCredit Reject TurnOff and so on you can do it in the following way:

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();
    ...
}

Upvotes: 0

Related Questions