You can also read an alternative definition taken from François-René Rideau's Glossary:
Ethymologically, to be reflective is to apply to oneself: reflectivity is when the subject and the object of some action are the same.
Notably, the human faculties to reason can be reflective, as one can think about one's thinking. We often say reflective for likewise potentially reflective, and say reflectivity instead of such potential eflectivity. In this above meaning, programming is a reflective activity, as one can program programs that program.
Beware that the word reflective is most often used in such extended meanings of the word. For instance, in elementary algebra, being considered a binary relation, elements linked to oneself are called reflective, and by extension, a binary relation where all elements are reflective is itself called reflective (which does not mean the relation applies to itself).
The question of whether the adjective "irreflective" is reflective or not is a well-known paradox (yet another variation of Epimenide's paradox) that shows that a meaningful discourse must restrict reflection severely.
The solution is to distrust reflective definitions, and when trying to give a well defined meaning to reflective objects, replace reflection by recursive equations and induction principles. It seems that everytime a reflective object is to be used statically, it can be expressed this way, because using such an object means firstly implementing its abstract idea in a "real" substratum world in which it has such clear meaning. This does not mean that reflection in general can be reduced to mere abstraction, just in the same way as logical thought does not reduce to deduction.
A programming language or an operating system is called reflective if suited to reflective programming, that is, to write programs that write programs (see metaprogramming).
The whole point about programming reflection is that it and only it allows a full control for all programs of what is to be explicit, and what is to be implicit.
Another equivalent way of defining a reflective system is to define it as a system in which that anything that could conceivably be programmed should be programmable in that system.....
Reflection is just needed for computer
development: if you want to develop a computer system from a supported
computer system, then there must be Reflection somewhere in the system.
Only that Reflection might be hidden, and might need a reboot everytime
it is used; for instance, Linux can be
developped from Linux, but you must kill all processes and reboot so
as to replace a current Linux with a developed Linux.
If I is the cost of all the irreflective
abstraction layers between the hardware and the first reflected part P
of the system; if R is the cost of all the abstraction layers that help
reflect P into itself, then the cost of doing k reflective operations is
greater than I+k*R (for compiled implementations; interpreted approaches
are exponentially worse). Current systems are such that all this often
is a prohibitive cost, and as a consequence, even though all systems are
somehow reflective, reflection is only marginally used. You can find
a very neat article about reflection here.