Reflection allows examining classes at runtime to discover methods and fields. The Class class has methods like forName() to get a Class object from a string. This allows discovering information about classes like superclasses, interfaces, methods and fields. Methods can be invoked using invoke() by passing the Method object and arguments. Annotations can provide additional semantics, like specifying ranges or properties for parameters.