https://en.wikipedia.org/wiki/Structured_systems_analysis_an...
https://en.wikipedia.org/wiki/Booch_method
Any language that gets into enterprise architect hands, with projects spread around multiple development sites with several consulting agencies, gets their FactoryFactories and such.
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.
Enterprise ORMs were created in Smalltalk, C++ and Objective-C, years before Java was created.
Poet and Enterprise Object Framework were two well known ones.
In fact J2EE was born of the ashes of a failed Objective-C project at Sun, Neo, after its collaboration with NeXT on OpenSTEP failed apart.
https://en.m.wikipedia.org/wiki/Distributed_Objects_Everywhe...
Things are not created in vacuum, it helps to actually know computing history.