Reflection in Java allows examination of classes, interfaces, fields and methods at runtime without knowing the names of the classes, fields or methods at compile time. It allows a program to create instances of classes, invoke methods, set and get field values, and execute other operations at runtime. The key classes for reflection include Class, Constructor, Field, Method and others in the java.lang.reflect package. Reflection is commonly used for activities like class browsing, debugging, testing and building extensible applications. However, it has performance and security implications and should not be used without consideration.