Metaprogramming involves techniques that allow programs to treat other programs as their data, enabling dynamic modification, generation, or analysis of code. In other words, Metaprogramming involves writing programs that manipulate other programs or themselves, often at runtime.

Concepts that fall under Metaprogramming are

Decorators

Reflection

Annotations

Code Generation

Macros

Aspect-Oriented Programming (AOP)

Introspection