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, fields, etc. Methods can be invoked using invoke() by passing the Method object and arguments. Annotations can provide additional semantics and enable compile-time checking by associating metadata with program elements.