Java reflection allows inspecting and modifying runtime behavior by examining classes, interfaces, and objects. It can get class information even if the class is not accessible at compile time. Some uses of reflection include IDEs, debuggers, and test tools. Reflection has drawbacks like poor performance and security issues. To use reflection, you first get the Class object using the .class syntax, getClass() method, or forName() method. With the Class object you can inspect fields, methods, constructors, modifiers, and more. Arrays are also supported through the Array class.