Interview question
What is the Reflection API in Java and what can you do with it? Java में Reflection API क्या है और इससे क्या कर सकते हैं?
Answer
Reflection lets a program inspect and manipulate classes, methods, fields, and constructors at RUNTIME, even without knowing their names at compile time - the foundation of many frameworks (Spring, Hibernate, JUnit).
import java.lang.reflect.*;
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
private void greet() {
System.out.println('Hello, ' + name);
}
}
public class ReflectionDemo {
public static void main(String[] args) throws Exception {
Class<?> clazz = Class.forName('Person'); // or Person.class
// Inspecting fields
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
System.out.println('Field: ' + field.getName() + ' - ' + field.getType());
}
// Inspecting methods
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
System.out.println('Method: ' + method.getName());
}
// Creating an instance dynamically
Constructor<?> constructor = clazz.getConstructor(String.class, int.class);
Object person = constructor.newInstance('John', 30);
// Accessing a PRIVATE field via reflection
Field nameField = clazz.getDeclaredField('name');
nameField.setAccessible(true); // bypasses access control
String name = (String) nameField.get(person);
System.out.println('Name: ' + name); // John
// Calling a PRIVATE method via reflection
Method greetMethod = clazz.getDeclaredMethod('greet');
greetMethod.setAccessible(true);
greetMethod.invoke(person); // Hello, John
}
}
// Real-world uses: Spring's dependency injection, JUnit finding @Test methods,
// JSON libraries (Gson/Jackson) mapping fields, ORM frameworks like HibernateReflection एक program को RUNTIME पर classes, methods, fields, constructors inspect और manipulate करने देता है, compile time पर names जाने बिना भी - कई frameworks (Spring, Hibernate, JUnit) की foundation है।
import java.lang.reflect.*;
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
private void greet() {
System.out.println('Hello, ' + name);
}
}
public class ReflectionDemo {
public static void main(String[] args) throws Exception {
Class<?> clazz = Class.forName('Person');
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
System.out.println('Field: ' + field.getName());
}
Constructor<?> constructor = clazz.getConstructor(String.class, int.class);
Object person = constructor.newInstance('John', 30);
Field nameField = clazz.getDeclaredField('name');
nameField.setAccessible(true);
String name = (String) nameField.get(person);
System.out.println('Name: ' + name);
Method greetMethod = clazz.getDeclaredMethod('greet');
greetMethod.setAccessible(true);
greetMethod.invoke(person);
}
}Was this answer clear?