Reflection in Java allows accessing private members, methods, and arrays at runtime, providing the ability to manipulate hidden or restricted elements.
Private fields are mainly for encapsulation and safety, as final fields ensure values remain constant and prevent accidental changes.
Deep reflection involves breaking into non-public elements using setAccessible(), allowing access to any element regardless of its visibility.
Deep reflection is commonly used for accessing private fields like changing values in a Person class, albeit caution is advised for final fields.
Reflection checks permissions every time a method is invoked, leading to performance overhead, and exception handling adds runtime cost.
MethodHandles.lookup() provides a more performant and flexible way to invoke methods and constructors compared to traditional reflection.
MethodHandle offers advantages like no parameter boxing, direct exception throwing, reduced access checks, and return type matching.
By using MethodHandles, developers can achieve more efficient method calls, especially for primitives, and have finer-grained access control.
Overall, deep reflection and MethodHandles provide powerful tools for dynamic manipulation and invocation in Java, enhancing flexibility and performance.