C and Go also don't do operator overloading.
Code generation was a thing in C and C++ during the 90's. Borland C++ 1.0 came with a macro library (BIDS), which was later replaced by a new template based version in Borland C++ 2.0.
And the Go culture of //go:generate goes beyond anything that Java has had on its almost 30 years of existence.
AOT compilation exists since the early 2000's. The only distaste is that most developers don't want to pay for their tools, so they rather used the free beer JDK from Sun instead third party vendors. So only big corporations got to buy the JDKs from IBM, Oracle, ExcelsiorJET, Aonix,....
However now AOT free beer exists on OpenJDK, OpenJ9, GraalVM and although not strictly Java, Android.
The culture of code generation before the culture of XML configuration.
They are there for a reason.
I'm waiting for more fun with JSONSLT the day someone has the idea to make a first limited and poorly documented implementation.