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 name as a string. Annotations can be used to add semantic information to classes and methods to provide additional meaning beyond just implementation.