1. μ λν μ΄μ μ μ£Όμκ³Ό κ°μ μλ―ΈλΌκ³ νλλ° λ°νμμ μ΄λ»κ² μ μ§κ° λΌ? μ¬λΌμ§μ§ μμκΉ?'
μ λν μ΄μ (annotation)μ μλ°μμ μμ€ μ½λμ λΆκ°μ μΈ μ 보λ₯Ό μΆκ°νλ λ©νλ°μ΄ν° μν μ νλλ°μ, μ£Όμκ³Όλ λ¬λ¦¬ μ»΄νμΌ μ΄νμλ νΉμ μ λν μ΄μ μ κ·Έλλ‘ μ μ§λμ΄ λ°νμμμ νμ©λ μ μμ΅λλ€.
μλ° μ λν μ΄μ μ ν¬κ² μΈ κ°μ§λ‘ λλ©λλ€.
- SOURCE: μ»΄νμΌλ¬μκ²λ§ μ 보λ₯Ό μ 곡νκ³ μ»΄νμΌλ νμλ μ¬λΌμ§λ μ λν
μ΄μ
μ
λλ€. μλ₯Ό λ€μ΄,
@Overrideλ μ»΄νμΌ μμλ§ νμν μ λν μ΄μ μ΄λΌ μ»΄νμΌ νμλ μ κ±°λ©λλ€. - CLASS: μ»΄νμΌλ ν .class νμΌμ μ μ₯λμ§λ§, λ°νμμμλ μ¬μ©λμ§ μλ μ λν μ΄μ μ λλ€.
- RUNTIME: λ°νμ μμλ μ μ§λμ΄ λ¦¬νλ μ
(reflection)μ ν΅ν΄ μ κ·Όν μ μλ μ λν
μ΄μ
μ
λλ€. μλ₯Ό λ€μ΄, Spring νλ μμν¬μ μ λν
μ΄μ
(
@Autowired,@Serviceλ±)μ λ°νμ μ μ¬μ©λκΈ° λλ¬ΈμRUNTIMEμΌλ‘ μ€μ λμ΄ μμ΅λλ€. μ΄λ€μ λ°νμμ 리νλ μ μ ν΅ν΄ μ κ·Όμ΄ κ°λ₯νμ¬ νλ μμν¬λ λΌμ΄λΈλ¬λ¦¬μμ μλμΌλ‘ κ°μ²΄λ₯Ό μ£Όμ νκ±°λ μ€μ ν λ νμ©λ©λλ€.
μ΄λ κ² λ°νμμ μ μ§λλ μ λν μ΄μ μ μλ° λ¦¬νλ μ APIλ₯Ό ν΅ν΄ λμ μΌλ‘ μ½κ³ μ²λ¦¬ν μ μμ΄μ, νλ μμν¬λ λΌμ΄λΈλ¬λ¦¬μμλ μ½λμ λμμ μ μ΄νκ±°λ μ€μ νλ λ° μμ£Ό μ¬μ©ν©λλ€.
리νλ μ (Reflection) APIλ μλ°μμ μ€ν μ€μΈ νλ‘κ·Έλ¨μ΄ μμ μ ꡬ쑰λ₯Ό μ‘°μ¬νκ³ μμ ν μ μκ² νλ κ°λ ₯ν κΈ°λ₯μ λλ€. 리νλ μ μ ν΅ν΄ ν΄λμ€μ λ©μλ, νλ, μμ±μ λ±μ λν μ 보λ₯Ό μ»κ³ λμ μΌλ‘ μ κ·Όν μ μμ΅λλ€. μλ₯Ό λ€μ΄, 리νλ μ μ ν΅ν΄ ν΄λμ€ μ΄λ¦μ μμ§ λͺ»νλ μνμμ νΉμ ν΄λμ€μ λ©μλλ₯Ό νΈμΆνκ±°λ νλ κ°μ μ½κ³ μΈ μ μμ΅λλ€. μ΄λ λ°νμμ λμ μΌλ‘ κ°μ²΄λ₯Ό μμ±νκ±°λ, λ©μλλ₯Ό νΈμΆνλ λ° μ μ©ν©λλ€.
리νλ μ APIμ μ£Όμ ν΄λμ€μ κΈ°λ₯μ λ€μκ³Ό κ°μ΅λλ€.
μλ°μ λͺ¨λ ν΄λμ€λ Class ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό ν΅ν΄ κ·Έ μ 보λ₯Ό μ°Έμ‘°ν μ μμ΅λλ€. Class κ°μ²΄λ₯Ό ν΅ν΄ λ©μλ, νλ, μμ±μ λ± λ€μν μ 보λ₯Ό μ»μ μ μμ΅λλ€. μλ₯Ό λ€μ΄, SomeClass.class λλ Class.forName("ν¨ν€μ§.ν΄λμ€μ΄λ¦")μ ν΅ν΄ Class κ°μ²΄λ₯Ό κ°μ Έμ¬ μ μμ΅λλ€.
Class κ°μ²΄λ₯Ό ν΅ν΄ μ¬μ©ν μ μλ μ£Όμ λ©μλλ λ€μκ³Ό κ°μ΅λλ€.
- getMethods() / getDeclaredMethods(): ν΄λμ€μ λͺ¨λ λ©μλ(λλ μ μΈλ λ©μλ)λ₯Ό κ°μ Έμ΅λλ€.
- getFields() / getDeclaredFields(): ν΄λμ€μ λͺ¨λ νλ(λλ μ μΈλ νλ)λ₯Ό κ°μ Έμ΅λλ€.
- getConstructors(): ν΄λμ€μ μμ±μ μ 보λ₯Ό κ°μ Έμ΅λλ€.
- getAnnotations(): ν΄λμ€μ μ μ©λ μ λν μ΄μ μ κ°μ Έμ΅λλ€.
리νλ μ μ ν΅ν΄ λμ μΌλ‘ κ°μ²΄λ₯Ό μμ±νκ³ , λ©μλλ₯Ό νΈμΆν μ μμ΅λλ€.
- newInstance(): 리νλ μ μ ν΅ν΄ λμ μΌλ‘ κ°μ²΄λ₯Ό μμ±ν©λλ€.
- invoke(): 리νλ μ μ μ¬μ©νμ¬ λ©μλλ₯Ό νΈμΆν©λλ€.
λ€μμ κ°λ¨ν 리νλ μ μ¬μ© μμ μ λλ€.
import java.lang.reflect.Method;
public class ReflectionExample {
public static void main(String[] args) {
try {
// Class κ°μ²΄λ₯Ό μ»μ
Class<?> clazz = Class.forName("mypackage.MyClass");
// μΈμ€ν΄μ€ μμ±
Object obj = clazz.getDeclaredConstructor().newInstance();
// λ©μλ νΈμΆ
Method method = clazz.getMethod("myMethod", String.class);
method.invoke(obj, "Hello, Reflection!");
} catch (Exception e) {
e.printStackTrace();
}
}
}μ΄ μμ μμλ MyClass ν΄λμ€μ myMethod λ©μλλ₯Ό λ°νμμ λμ μΌλ‘ νΈμΆν©λλ€. 리νλ μ
APIλ₯Ό μ¬μ©νλ©΄ μ΄μ²λΌ μ»΄νμΌ μμ μ ν΄λμ€λ λ©μλμ λν μ 보λ₯Ό μμ§ λͺ»ν΄λ λ°νμμ μ΄λ₯Ό μ°Ύμλ΄κ³ μ¬μ©ν μ μμ΅λλ€.
μ₯μ :
- μ μ°νκ³ λμ μΈ μ½λ μμ±μ΄ κ°λ₯ν¨.
- λ°νμμ ν΄λμ€ κ΅¬μ‘°λ₯Ό μ‘°μ¬νκ³ νμ©ν μ μμ΄ νλ μμν¬λ λΌμ΄λΈλ¬λ¦¬ μ€κ³μ νμμ μ.
λ¨μ :
- μ±λ₯μ΄ μ νλ μ μμ.
- μΊ‘μνλ₯Ό μλ°ν μ μμ΄ μλͺ» μ¬μ©ν κ²½μ° λ³΄μ μ·¨μ½μ μ΄ μκΈΈ μ μμ.
리νλ μ μ κ°λ ₯νμ§λ§ 볡μ‘λμ μ±λ₯ μ νκ° μλ°λ μ μμ΄ νμν κ²½μ°μ μ μ€νκ² μ¬μ©νλ κ²μ΄ μ’μ΅λλ€.