Reflection is best used for when you don't know the exact implementation that will be used until runtime. Take for example:
Two implementation of a List Generator
Both of these implementations would do the same job, but do it in different ways. I could choose which method to use when I run the application using a configuration file or command line argument:
Since you can use configuration files, environment properties, or command line properties to define what specific class to use then your running code doesn't have any dependency on the specific class, and you will be able to generate new implementations without affecting your current code. This makes it useful for frameworks, for plug-in capability, and for application extensions.
One API that uses it a lot is the JDBC API where each database needs its own driver for talking with the database. Since Java can't know about all possible implementations they allow the user to choose which implementation should be used by providing a JAR with the proper driver and using reflection to register the driver for use.
Servlet Containers use it as well. You create a configuration file (web.xml) which defines which Servlets are part of the web application. The servlet container then goes through the list using reflection to load the classes so that it can instantiate and initialize them, and finally use them for serving requests.
Reflection can also be used to find a lot of information about a class or object, as well as to dynamically load and instantiate them. You have the ability to lookup method names, variables, annotations, and the class heirarchy.