A programming language is said to be reflective if it has the integral ability to observe or change its own code as well as all aspects of its programming language (syntax, semantics, or implementation) at runtime.  Reflective programming languages includes features that allow it to ask about the current state of the program, e.g., by being able to inspect what classes are defined, what methods those classes define, or what instances of those classes have been created. This makes it far easier to write test harnesses and dynamic programs. However, one issue with reflective programming languages is that it is less clear when a part of the program has become actually unreachable as reflective techniques could be used to revive a reference to it.
- A Tutorial on Behavioral Reflection and its Implementation by Matt Hurlbutt