Reflection is a highly dynamic approach for flexibility - at the price of high complexity and slower runtime performance. Successful generative computing approaches try to push the decision making phase into the compile phase. The generated code is highly specialized for one purpose but runs fast. If the purpose changes the code needs to be re-generated.
Extremely powerful and flexible systems try to make the model information even available to the program at runtime.