- 1Java OOP Introduction
- 2Java Class
- 3Java Class Constructor
- 4Java Class Objects
- 5Java Access Modifiers
- 6Java Static Variables in Classes
- 7Java Static Methods Explained
- 8Java Static Blocks
- 9Java final Variables
- 10Java final Methods
- 11Java final class
- 12Inheritance in Java
- 13Java Method Overriding
- 14Java Abstraction in OOP
- 15Interfaces in Java
- 16Polymorphism in Java
- 17Encapsulation in Java
- 18Java Nested Classes
- 19Java Nested Static Class
- 20Java Anonymous Class
- 21Java Singleton Class
- 22Java Enums
- 23Reflection in Java
Reflection in Java
Reflection in Java is a powerful and somewhat magical feature. It lets your code inspect and manipulate itself or other classes at runtime. Think of it as a way to peek behind the curtain of how Java classes, fields, and methods are structured and to even tweak them dynamically—without knowing their names at compile time.
Why Use Reflection?
- To create instances of classes dynamically (useful in frameworks and tools)
- To inspect metadata (like class names, fields, annotations)
- To invoke methods or access fields that might otherwise be private
- To write generic code that can operate on any class
Key Classes in the Reflection API
The Java Reflection API is primarily built around classes from the java.lang.reflect package:
- Class- Represents classes and interfaces
- Method- Represents class methods
- Field- Represents class variables
- Constructor- Represents class constructors
Getting the Class Object
To begin reflection, we first need a Class object. Here's how:
Class<?> clazz1 = MyClass.class;              // Using .class
Class<?> clazz2 = obj.getClass();             // From an instance
Class<?> clazz3 = Class.forName("MyClass");   // By nameLet’s see a complete example.
class MyClass {
    public int x = 42;
    private String secret = "Hidden Message";
    public void show() {
        System.out.println("Hello from MyClass!");
    }
}public class ReflectionDemo {
    public static void main(String[] args) throws Exception {
        Class<?> clazz = Class.forName("MyClass");
        Object obj = clazz.getDeclaredConstructor().newInstance();
        System.out.println("Class name: " + clazz.getName());
        // Access public field
        java.lang.reflect.Field field = clazz.getField("x");
        System.out.println("Value of x: " + field.getInt(obj));
    }
}Class name: MyClass
Value of x: 42Accessing Private Fields
Reflection even allows access to private fields—something you can’t do through regular code.
Field secretField = clazz.getDeclaredField("secret");
secretField.setAccessible(true);
String secretValue = (String) secretField.get(obj);
System.out.println("Private field value: " + secretValue);Private field value: Hidden MessageListing All Fields and Methods
for (Field f : clazz.getDeclaredFields()) {
    System.out.println("Field: " + f.getName());
}
for (Method m : clazz.getDeclaredMethods()) {
    System.out.println("Method: " + m.getName());
}Field: x
Field: secret
Method: showInvoking Methods with Reflection
Method method = clazz.getMethod("show");
method.invoke(obj);Hello from MyClass!Creating Instances Dynamically
This technique is heavily used in frameworks like Spring or Hibernate where classes are created on-the-fly.
Class<?> dynamicClass = Class.forName("MyClass");
Object instance = dynamicClass.getDeclaredConstructor().newInstance();Accessing Constructors
Constructor<?> constructor = clazz.getDeclaredConstructor();
System.out.println("Constructor: " + constructor.getName());Constructor: MyClassCommon Pitfalls and Considerations
- Performance Overhead: Reflection is slower than direct access
- Security Restrictions: Accessing private members might throw exceptions if security manager is active
- Loss of Compile-time Safety: Errors show up only at runtime
Use Cases in Real-World Development
Reflection plays a crucial role in:
- Frameworks like Spring and Hibernate
- Dependency Injection
- Testing Frameworks like JUnit
- Object Mappers like Jackson or GSON
QUIZ
Question 1:Which class from the Reflection API is used to represent the methods of a Java class?
Question 2:Using reflection, you can access private fields of a class at runtime.
 Question 3:Which of the following are valid ways to obtain a Class<?> object in Java?
 Question 4:What is the output of the following code?
Field secretField = clazz.getDeclaredField("secret");
secretField.setAccessible(true);
String secretValue = (String) secretField.get(obj);
System.out.println("Secret: " + secretValue);
Field secretField = clazz.getDeclaredField("secret");
secretField.setAccessible(true);
String secretValue = (String) secretField.get(obj);
System.out.println("Secret: " + secretValue);








Comments
Loading comments...