Reflection is slow(er), but not necessarily hacky, it is just a different way of doing things.
All code generated for current languages strip away the "dynamicness" of having runtime information for maximum speed, so no, they don't have "getFields" style calls. Even if you had such a call, once you know about a field, being able to access it would require further code, which is exactly what the reflection code currently does.
So for debug prints, you currently have two options: idl_gen_text.cpp can turn a FlatBuffer into a JSON string, and reflection.h can also turn individual parts of FlatBuffers into strings. I know these are both C++, but since the input is a FlatBuffer and the output is a string, this makes for a very simple JNI interface.
Beyond that, the reflection code is based on something that is available in all languages: you can turn a schema into a FlatBuffer, which can then be read by any language. From this meta-schema generated code you can then find out what fields a table has, etc. What is currently missing in Java is to turn that knowledge into field-accesses, much like reflection.h.