π Java Reflection
Java Reflectionμ λ°νμ(Run-time)μ ν΄λμ€, λ©μλ, νλ λ±μ μ 보λ₯Ό λμ μΌλ‘ νμνκ³ μ‘°μν μ μλ κΈ°λ₯μ μ 곡νλ Java APIμ λλ€. μ¦, μ½λ μ€ν μ€μ ν΄λμ€μ ꡬ쑰λ₯Ό κ²μ¬νκ±°λ μ‘°μν μ μμ΅λλ€.
리νλ μ
μ java.lang.reflect
ν¨ν€μ§μ java.lang.Class
ν΄λμ€λ₯Ό ν΅ν΄ μ 곡λ©λλ€.
1. 리νλ μ μ μ£Όμ κΈ°λ₯
- ν΄λμ€ μ 보 μ‘°ν: ν΄λμ€ μ΄λ¦, ν¨ν€μ§ μ΄λ¦, λΆλͺ¨ ν΄λμ€, ꡬν μΈν°νμ΄μ€ λ±μ μ 보λ₯Ό νμΈν μ μμ΅λλ€.
- νλ(Field) μ‘°ν λ° μμ : ν΄λμ€μ λ©€λ² λ³μλ₯Ό λμ μΌλ‘ μ½κ³ μμ ν μ μμ΅λλ€.
- λ©μλ(Method) νΈμΆ: ν΄λμ€μ λ©μλλ₯Ό λμ μΌλ‘ νΈμΆν μ μμ΅λλ€.
- μμ±μ(Constructor) νΈμΆ: ν΄λμ€λ₯Ό λμ μΌλ‘ μΈμ€ν΄μ€νν μ μμ΅λλ€.
- μ΄λ Έν μ΄μ (Annotation) μ‘°ν: ν΄λμ€, λ©μλ, νλμ μ μλ μ΄λ Έν μ΄μ μ 보λ₯Ό λμ μΌλ‘ μ½μ μ μμ΅λλ€.
2. 리νλ μ μ κΈ°λ³Έ API
리νλ μ μ λ€μκ³Ό κ°μ μ£Όμ ν΄λμ€μ λ©μλλ₯Ό ν΅ν΄ μ¬μ©λ©λλ€:
1) Class
ν΄λμ€
λͺ¨λ Java κ°μ²΄μ λ©νλ°μ΄ν°λ₯Ό μ 곡νλ ν΄λμ€μ
λλ€. Class
κ°μ²΄λ 리νλ μ
μ μμμ μ
λλ€.
Class
κ°μ²΄ κ°μ Έμ€λ λ°©λ²:
// 1. ν΄λμ€ μ΄λ¦μΌλ‘ κ°μ Έμ€κΈ°
Class<?> clazz = MyClass.class;
// 2. κ°μ²΄λ‘λΆν° κ°μ Έμ€κΈ°
MyClass obj = new MyClass();
Class<?> clazz = obj.getClass();
// 3. ν΄λμ€ μ΄λ¦ λ¬Έμμ΄λ‘ κ°μ Έμ€κΈ°
Class<?> clazz = Class.forName("com.example.MyClass");
2) νλ(Field) μ κ·Ό
μμ : ν΄λμ€ νλ μ‘°ν λ° κ° μ€μ
import java.lang.reflect.Field;
class Person {
private String name = "John";
public int age = 30;
}
public class ReflectionExample {
public static void main(String[] args) throws Exception {
Person person = new Person();
// Class κ°μ²΄ κ°μ Έμ€κΈ°
Class<?> clazz = person.getClass();
// νλ μ 보 κ°μ Έμ€κΈ°
Field nameField = clazz.getDeclaredField("name");
nameField.setAccessible(true); // private νλμ μ κ·Ό νμ©
// νλ κ° μ½κΈ°
String nameValue = (String) nameField.get(person);
System.out.println("Name: " + nameValue); // μΆλ ₯: Name: John
// νλ κ° μ€μ
nameField.set(person, "Alice");
System.out.println("Updated Name: " + nameField.get(person)); // μΆλ ₯: Updated Name: Alice
}
}
3) λ©μλ(Method) νΈμΆ
μμ : λ©μλ νΈμΆνκΈ°
import java.lang.reflect.Method;
class Calculator {
public int add(int a, int b) {
return a + b;
}
}
public class ReflectionExample {
public static void main(String[] args) throws Exception {
Calculator calculator = new Calculator();
// Class κ°μ²΄ κ°μ Έμ€κΈ°
Class<?> clazz = calculator.getClass();
// λ©μλ κ°μ Έμ€κΈ°
Method addMethod = clazz.getDeclaredMethod("add", int.class, int.class);
// λ©μλ νΈμΆ
int result = (int) addMethod.invoke(calculator, 10, 20);
System.out.println("Result: " + result); // μΆλ ₯: Result: 30
}
}
4) μμ±μ(Constructor) νΈμΆ
μμ : κ°μ²΄ λμ μμ±
import java.lang.reflect.Constructor;
class Person {
private String name;
public Person(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{name='" + name + "'}";
}
}
public class ReflectionExample {
public static void main(String[] args) throws Exception {
// Class κ°μ²΄ κ°μ Έμ€κΈ°
Class<?> clazz = Person.class;
// μμ±μ κ°μ Έμ€κΈ°
Constructor<?> constructor = clazz.getDeclaredConstructor(String.class);
// λμ κ°μ²΄ μμ±
Person person = (Person) constructor.newInstance("John");
System.out.println(person); // μΆλ ₯: Person{name='John'}
}
}
5) μ΄λ Έν μ΄μ (Annotation) μ 보 μ‘°ν
μμ : ν΄λμ€μ μ΄λ Έν μ΄μ νμΈ
import java.lang.annotation.*;
import java.lang.reflect.*;
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {
String value();
}
@MyAnnotation("Test Class")
class TestClass {}
public class ReflectionExample {
public static void main(String[] args) throws Exception {
// Class κ°μ²΄ κ°μ Έμ€κΈ°
Class<?> clazz = TestClass.class;
// μ΄λ
Έν
μ΄μ
νμΈ
if (clazz.isAnnotationPresent(MyAnnotation.class)) {
MyAnnotation annotation = clazz.getAnnotation(MyAnnotation.class);
System.out.println("Annotation Value: " + annotation.value()); // μΆλ ₯: Annotation Value: Test Class
}
}
}
3. 리νλ μ μ μ₯μ
- λμ λμ ꡬν: λ°νμμ ν΄λμ€μ ꡬ쑰λ₯Ό λμ μΌλ‘ νμΈνκ³ , κ°μ²΄λ₯Ό μ‘°μν μ μμ΅λλ€.
- μ μ°μ±: μ»΄νμΌ μμ μ μ μ μλ ν΄λμ€λ λ©μλμ λμ μΌλ‘ μ κ·Όν μ μμ΅λλ€. νλ¬κ·ΈμΈ μμ€ν , μμ‘΄μ± μ£Όμ , JSON μ§λ ¬ν λ±μ νμ©λ©λλ€.
4. 리νλ μ μ λ¨μ
- μ±λ₯ λ¬Έμ : 리νλ μ μ μΌλ° λ©μλ νΈμΆλ³΄λ€ λ립λλ€. λ΄λΆμ μΌλ‘ λ§μ κ²μ¦ μμ μ΄ νμνκΈ° λλ¬Έμ λλ€.
- μμ μ± λ¬Έμ : μ»΄νμΌ νμμ κ²μ¦λμ§ μμΌλ―λ‘ λ°νμ μλ¬κ° λ°μν κ°λ₯μ±μ΄ λμ΅λλ€.
- 보μ λ¬Έμ : 리νλ μ μΌλ‘ private νλλ λ©μλμ μ κ·Όν μ μμΌλ―λ‘ λ³΄μμμ 리μ€ν¬κ° μμ΅λλ€.
5. 리νλ μ μ νμ© μ¬λ‘
- νλ μμν¬ κ°λ°: Spring, Hibernate λ±μμ μμ‘΄μ± μ£Όμ (Dependency Injection), λμ νλ‘μ μμ± λ±μ μ¬μ©λ©λλ€.
- JSON μ§λ ¬ν/μμ§λ ¬ν: κ°μ²΄λ₯Ό JSONμΌλ‘ λ³ννκ±°λ μμ§λ ¬ννλ λΌμ΄λΈλ¬λ¦¬μμ νμ©λ©λλ€.
- JUnit ν μ€νΈ νλ μμν¬: ν μ€νΈ λ©μλ λμ μ€νμ 리νλ μ μ΄ μ¬μ©λ©λλ€.
'Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
μλ° enum (0) | 2024.12.09 |
---|---|
[Java] JDK, JRE, JVM μ§μμλ΅ (ChatGPT) (1) | 2024.08.31 |
[Java] Reflection (2) | 2024.02.21 |
Generics (Java) (1) | 2024.02.12 |
JVM λ©λͺ¨λ¦¬ ꡬ쑰 (JAVA) (1) | 2024.02.08 |
λκΈ