import java.lang.reflect.*;

void main() throws Throwable {
	var m = getClass().getDeclaredMethod("getOwner", Base.Handler.class);
	IO.println(m);
	IO.println(Arrays.toString(m.getGenericParameterTypes()));
	IO.println(m.getGenericReturnType());
}

<S extends Base<S>> S getOwner(S.Handler handler) {
	return handler.owner();
}

abstract class Base<S extends Base<S>> {
	class Handler {
		@SuppressWarnings("unchecked")
		S owner() {
			return (S) Base.this;
		}
	}

}
