Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Call all methods within a class

I have a class, which has a method calls all of the rest methods within the same class.

One way to do it is by using reflection framework, are there other ways?

[edit] Example code added:


import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;


public class AClass {

    private void aMethod(){

    }

    private void bMethod(){

    }

    private void cMethod(){

    }

    private void dMethod(){

    }

    //50 more methods. 

    //method call the rest
    public void callAll() throws IllegalArgumentException, IllegalAccessException, InvocationTargetException{
        Method[] methods = this.getClass().getMethods();
        for (Method m : methods) {
            if (m.getName().endsWith("Method")) {
                //do stuff..
            }
        }
    }

}

I actually don't have a problem with calling all 4 methods from callAll(), i.e. avoid using reflection. But one of my colleagues pointed out that what if there are 50 methods, are you going to call them one by one? I don't have an answer for that, that's why I am asking the question here.

Thanks, Sarah

like image 358
sarahTheButterFly Avatar asked Oct 18 '25 12:10

sarahTheButterFly


2 Answers

Actually, you'd probably want to use Class.getDeclaredMethods(). Class.getMethods() only returns public methods and none of the methods you show are public (and it also returns the public methods inherited from super classes).

That said: In the scenario you mention, reflection is a valid approach. All other (manual) approaches would be error-prone.

However, using a naming convention seems to weak to me as a guard. I'd write a custom annotation, and if that is present, I'd execute the method. Example:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface RunMe {}

And here's your modified code:

public void callAll() throws
IllegalArgumentException, IllegalAccessException, InvocationTargetException{
    Method[] methods = this.getClass().getDeclaredMethods();
    for (Method m : methods) {
        if (m.getAnnotation(RunMe.class)!=null) {
            //do stuff..
        }
    }
}
like image 158
Sean Patrick Floyd Avatar answered Oct 21 '25 00:10

Sean Patrick Floyd


I'm pretty sure that anything you end up doing is going to ultimately boil down to reflection anyways; eg: aspects, DI, etc. So I don't know what the gain would be - convenience maybe?

like image 45
javamonkey79 Avatar answered Oct 21 '25 02:10

javamonkey79



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!