Reflection in Java allows programs to inspect and modify classes, fields, methods, and constructors at runtime without knowing the names or types of said classes, fields, methods, or constructors at compile time. The lecture discusses the core reflection classes like Class, Field, Method, Constructor, and AccessibleObject. It demonstrates how to use reflection to get information about a class like its fields and methods, as well as how to invoke methods, get/set field values, and create new instances of classes using reflection on an example ATM class. Arrays can also be manipulated using reflection through the Array class.