1. Metaprogramming in Ruby allows code to manipulate and extend language constructs at runtime. This enables code to generate or modify other code, create domain-specific languages, and perform introspection to retrieve information about objects. 2. Ruby supports introspection through various methods that allow retrieving information about classes and objects like their methods, variables, and inheritance. Classes can also be reopened to add or modify methods. 3. Ruby uses dynamic method lookup and allows sending messages to objects at runtime through methods like send. This dynamic nature facilitates metaprogramming techniques like dynamically defining and calling methods.