A general definition of reflection in programming languages, given in [Demers and Malenfant], is:
Reflection is the ability of a program to manipulate as data something representing the state of the program during its own execution. There are two aspects of such manipulation: introspection and intercession. Introspection is the ability for a program to observe and therefore reason about its own state. Intercession is the ability for a program to modify its own execution state or alter its own interpretation or meaning. Both aspects require a mechanism for encoding execution state as data; providing such an encoding is called reification.
[Ferber] discusses several models of reflection. The model which
corresponds most to Java is what he calls the specific meta-object
model in which each object has a meta-object representing all its
otherwise implicit information. Meta-objects are instances of a class
META-OBJECT or one of its subclasses. As we will see below, the Java
class Class corresponds to his META-OBJECT.
Reflection vs. reification...
History: lots of Lisp stuff. Smalltalk?