They are useful for invoking class methods, and constructing classes at runtime, when you don't know (until runtime) what class you need to invoke. They also allow you to inspect class methods, parameters and values (for example the XMLEncoder class does this to write out a reprsentation of a bean into xml).