Search code examples
javamethodsreflectionmethod-invocation

Java invoke method using reflection


I am trying to invoke a method using reflection.

The method I am invoking is not static and in the same class I am invoking it from.

A simplified version of my code:

public class Test {
  public static void main(String[] args) {
    Test instance = new Test();
    if (args.length > 0) {
      instance.doWork(args[0]);
    }
  }

  private void doWork(String methodName) {
    Method method;

    try {
      method = this.getClass().getMethod(methodName);
      method.invoke(this);
    } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
      [...]
    }
  }

  private void MethodOne() { ... };
  private void MethodTwo() { ... };
  [...]
  private void MethodTwenty() { ... };
}

What I am getting is a java.lang.NoSuchMethodException: correct.package.and.class.MethodTwo() despite the package / class / method existing.

Can someone tell me what I am doing wrong?


Solution

  • What I am getting is a java.lang.NoSuchMethodException: correct.package.and.class.MethodTwo()...

    you are calling the getMethod() which is not giving back the private method

    Assuming that arg[0] has the right name of the method (if not you'll get a java.lang.NoSuchMethodException again), 2 thing must be done here:

    1. you need to use getDeclaredMethod (because MethodOne is private declared)

    2. your need to set the flag for access to it .setAccessible(true) (this will allow you to invoke a method that is declared private)

    Example:

        Method method;
        try {
            method = f.getClass().getDeclaredMethod("doThis");
    
            method.setAccessible(true);
            method.invoke(f);
        } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
                | InvocationTargetException e) {
            System.err.println("Opala, somethign went wrong here!");
        }