import static java.lang.invoke.MethodHandles.lookup;

import java.lang.reflect.InvocationTargetException;

import fr.umlv.nreflect.ReflectMirror;

public class Main {
  private void foo(String s) {
    System.out.println("hello " + s);
  }
  
  private static void bar(String s) {
    System.out.println("hello " + s);
  }
  
  public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException {
    var foo = Main.class.getDeclaredMethod("foo", String.class);
    var fooMirror = ReflectMirror.mirror(lookup(), foo);
    System.out.println(fooMirror);
    var main = new Main();
    fooMirror.invoke(main, "bob");
    
    var bar = Main.class.getDeclaredMethod("bar", String.class);
    var barMirror = ReflectMirror.mirror(lookup(), bar);
    System.out.println(barMirror);
    barMirror.invoke(main, "anna");
  }
}