Reflection
Reflection allows a program to inspect types and, depending on the language and runtime permissions, access members dynamically at runtime. It powers frameworks such as dependency injection, serializers, ORMs and test frameworks. Reflection can weaken encapsulation when code accesses private members through runtime metadata or bypass mechanisms. It can also have performance and maintainability costs because operations may require metadata lookup, dynamic invocation and reduced compiler optimization compared with direct calls. Modern runtimes often optimize or cache reflective operations, so the actual cost should be measured rather than assumed.
Reflection can inspect classes, methods, fields, constructors and annotations.
Frameworks use it for dependency injection, serialization, ORM mapping and testing.
It can bypass ordinary encapsulation depending on runtime and access rules.
Dynamic invocation can be slower than direct invocation.
Reflection can increase startup time, memory use and complexity.
Cache metadata or method handles/delegates where appropriate for hot paths.
Use reflection deliberately at framework boundaries rather than as a default application programming technique.