Reflection (see Wikipedia entry) is all about interacting with the runtime environment as it's running. Languages that support reflection give you different means of getting information from runtime objects (like classes) and some even go as far as letting you dynamically create new classes and methods at runtime.
In Java, Reflection can be used to get information about in-memory objects, the classes that they are instances of, the methods in those classes, what kind of parameters they take, what kind of fields are defined in the class, are they public/private/protected, etc. etc. etc.
Here is a crude example: this program reads a method name from the command line, finds it in the class and tries to invoke it on the object.