import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.common.reflection.qual.MethodVal;

/** Example used in the reflection resolution section of the Checker Framework manual. */
public class NullnessReflectionExampleTest {
  @NonNull Location getCurrentLocation() {
    // ...
    return new Location();
  }

  String getCurrentCity()
      throws NoSuchMethodException,
          SecurityException,
          IllegalAccessException,
          IllegalArgumentException,
          InvocationTargetException {
    @MethodVal(
        className = "NullnessReflectionExampleTest",
        methodName = "getCurrentLocation",
        params = 0)
    Method toLowerCase = getClass().getMethod("getCurrentLocation");
    Location currentLocation = (Location) toLowerCase.invoke(this);
    return currentLocation.nameOfCity();
  }
}

class Location {
  String nameOfCity() {
    return "Seattle";
  }
}
