4

In Java, or Groovy, say I have a String array like

myArray = ["SA1", "SA2", "SA3", "SA4"]

I want to call a different function based off of each string.

class Myclass{
  public static void SA1() {
    //doMyStuff
  }
  public static void SA2() {
    //doMyStuff
  }
  ...etc
}

I would love to be able to loop through my array and call the functions that they pertain to without having to compare the string or make a case statement. For example is there a way to do something like the following, I know it doesn't currently work:

Myclass[myArray[0]]();

Or if you have suggestions of another way I can structure something similar.

4 Answers 4

4

In groovy you can do:

Myclass.(myArray[0])()

In Java you can do:

MyClass.class.getMethod(myArray[0]).invoke(null);
Sign up to request clarification or add additional context in comments.

5 Comments

Hallelujah! I'm so glad I am using groovy. That's exactly what I was trying to do.
And on your java example, what is the null for when you invoke the method?
Normally you want to execute methods on objects. In this case you have to pass the object you want to use. But in your example you are using static methods so no object is needed. Thats why null is passed to the invoke method.
@micha, why println Myclass.(myArray[0])() works but myArray.each { println Myclass.(it)() } doesn't?
Hm good question, I am not sure. MyClass.(it.toString())() works
4

In Groovy, you can use a GString for dynamic method invocation:

myArray.each {
  println Myclass."$it"()
}

Comments

2

You can, for instance, declare an interface such as:

public interface Processor
{
    void process(String arg);
}

then implement this interface, for example in singletons.

Then create a Map<String, Processor> where keys are your strings, values are implementations and, when invoking:

Processor p = theMap.containsKey(theString)
    ? theMap.get(theString)
    : defaultProcessor;

p.process(theString);

Comments

0

I suggest you look at Reflection APIs, to call methods at runtime check Reflection docs

Class cl = Class.forName("/* your class */");
Object obj = cl.newInstance();

//call each method from the loop
Method method = cl.getDeclaredMethod("/* methodName */", params);
method.invoke(obj, null);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.