Reflectionμ μ€ν μ€μΈ Java νλ‘κ·Έλ¨μμ ν΄λμ€, μΈν°νμ΄μ€, νλ, λ©μλ λ±μ μ 보λ₯Ό κ°μ Έμ€κ³ , μ΄λ° μμλ€μ λμ μΌλ‘ μ‘°μν μ μλ κΈ°λ₯ μ΄λ€.
Reflectionμ μ¬μ©νλ©΄ μ»΄νμΌ μμ μ μ μ μμλ ν΄λμ€μ μ 보λ₯Ό μ‘°μ¬νκ³ , κ°μ²΄λ₯Ό μμ±νλ©°, λ©μλλ₯Ό νΈμΆνκ³ , νλμ μ κ·Όν μ μλ€.
Reflection μ¬μ©ν΄μΌ νλ κ²½μ°
ν΄λμ€μ μ 보 λΆμ
Reflectionμ μ¬μ©νμ¬ μ€ν μ€μΈ Java νλ‘κ·Έλ¨μμ ν΄λμ€μ μ΄λ¦, μμ κ³μΈ΅, ꡬν μΈν°νμ΄μ€, νλ λ° λ©μλ λ±μ μ 보λ₯Ό λμ μΌλ‘ μμλΌ μ μλ€.
μ΄λ₯Ό νμ©ν΄ ν΄λμ€μ λμ λ‘λ©, λ©νλ°μ΄ν° κ²μ¬, λμ λ°μΈλ© λ± μ¬λ¬ μμ
μ΄ μν κ°λ₯νλ€.
κ°μ²΄μ λμ μμ±
Reflectionμ μ¬μ©νλ©΄ μ€ν μ€μ λμ μΌλ‘ κ°μ²΄λ₯Ό μμ±ν μ μλ€.
ν΄λμ€ μ΄λ¦μ λμ μΌλ‘ μμλ΄κ³ , Class.newInstance() λ©μλλ₯Ό μ¬μ©νμ¬ κ°μ²΄λ₯Ό μμ±ν μ μλ€.
ν©ν 리 ν¨ν΄, μμ‘΄μ± μ£Όμ
λ±μ μν©μμ μ μ©ν μ μλ€.
λ©μλμ λμ νΈμΆ
Reflectionμ μ¬μ©νλ©΄ μ€ν μ€μ λ©μλλ₯Ό λμ μΌλ‘ νΈμΆν μ μλ€.
λ©μλ μ΄λ¦, λ§€κ°λ³μ νμ
λ±μ μ 보λ₯Ό μμλ΄κ³ , Method.invoke() λ©μλλ₯Ό μ¬μ©νμ¬ λ©μλλ₯Ό νΈμΆν μ μλ€.
Reflection κΈ°λ°μ λμ λμ€ν¨μΉ λ±μ μν©μμ μ μ©ν μ μλ€.
Reflectionμ λ΄μ₯ν¨μ
μλ ν¨μλ€μ java.lang.Class ν΄λμ€μ λ©μλλ‘ μ 곡νλ€.
getDeclaredFields()
ν΄λμ€μ λͺ¨λ νλλ₯Ό λ°ννλ€.
μμλ°μ νλλ μΈν°νμ΄μ€μμ μμλ°μ νλλ ν¬ν¨νμ§ μλλ€.
Field λ°°μ΄λ‘ λ°νλλ©°, κ° νλμλ ν΄λΉ νλμ μ 보μ κΈ°λ₯μ μ κ·ΌνκΈ° μν λ©μλκ° μλ€.
getDeclaredMethods()
ν΄λμ€μ λͺ¨λ λ©μλλ₯Ό λ°ννλ€.
μμλ°μ λ©μλλ μΈν°νμ΄μ€μμ μμλ°μ λ©μλλ ν¬ν¨νμ§ μλλ€.
Method λ°°μ΄λ‘ λ°νλλ©°, κ° λ©μλμλ ν΄λΉ λ©μλμ μ 보μ κΈ°λ₯μ μ κ·ΌνκΈ° μν λ©μλκ° μλ€.
getDeclaredConstructors()
ν΄λμ€μ λͺ¨λ μμ±μλ₯Ό λ°ννλ€.
Constructor λ°°μ΄λ‘ λ°νλλ©°, κ° μμ±μμλ ν΄λΉ μμ±μμ μ 보μ κΈ°λ₯μ μ κ·ΌνκΈ° μν λ©μλκ° μλ€.
getMethod(String name, Class<?>... parameterType)
μ§μ λ μ΄λ¦κ³Ό λ§€κ°λ³μ νμ
μ ν΄λΉνλ κ³΅κ° λ©μλλ₯Ό λ°ννλ€.
μμλ°μ λ©μλ λν ν¬ν¨νλ€.
Method κ°μ²΄λ₯Ό λ°ννλ©°, ν΄λΉ λ©μλμλ ν΄λΉ λ©μλμ μ 보μ κΈ°λ₯μ μ κ·ΌνκΈ° μν λ©μλκ° μλ€.
getField(String name)
μ§μ λ μ΄λ¦μ κ³΅κ° νλλ₯Ό λ°ννλ€.
μμλ°μ νλ λν ν¬ν¨νλ€.
Field κ°μ²΄λ₯Ό λ°ννλ©°, ν΄λΉ νλμλ ν΄λΉ νλμ μ 보μ κΈ°λ₯μ μ κ·ΌνκΈ° μν λ©μλκ° μλ€.
μ΄ μΈμλ getSuperclass(), getInterface(), newInstance() λ±μ λ©μλλ₯Ό μ¬μ©νλ©΄ ν΄λμ€μ μμ ν΄λμ€, ꡬνν μΈν°νμ΄μ€, κ°μ²΄μ μΈμ€ν΄μ€λ₯Ό μμ±νλ λ±μ λμμ μνν μ μλ€.
μ±λ₯
Reflectionμ μΌλ°μ μΈ λ©μλ νΈμΆλ³΄λ€ μ±λ₯μ΄ λ¨μ΄μ§ μ μλ€.
Reflection μμ
μ μΆκ°μ μΈ μ€λ²ν€λκ° λ°μνλ―λ‘ μ±λ₯μ΄ μ€μν μ½λμμ λ무 μμ£Ό μ¬μ©νλ κ²μ μ’μ§ μλ€.
보μ
Reflectionμ μ¬μ©νλ©΄ μ κ·Ό μ νμλ₯Ό μ°ννμ¬ private λ©€λ²μ μ κ·Όν μ μλ€.
Reflectionμ μ¬μ©ν λλ 보μ κ²μ¬λ₯Ό μΆ©λΆν μννκ³ νμν κΆνμ νμΈν΄μΌ νλ€.
κ°λ
μ± λ° μ μ§λ³΄μμ±
Reflectionμ μ½λμ κ°λ
μ±κ³Ό μ μ§λ³΄μμ±μ μ νμν¬ μ μλ€.
Reflectionμ μ¬μ©νλ©΄ μ½λμ λμμ΄ λμ μ΄ λλ―λ‘ μ½λλ₯Ό μ΄ν΄νκΈ° μ΄λ €μμ§ μ μλ€.
Reflectionμ μ¬μ©ν λλ λͺ
νν μ΄μ μ λͺ©μ μ΄ μμ κ²½μ°μλ§ μ¬μ©νκ³ , μ£Όμμ΄λ λ¬Έμνλ₯Ό ν΅ν΄ μ½λμ μλλ₯Ό λͺ
νν μ λ¬ν΄μΌ νλ€.
public class ReflectionExample {
public static void main (String [] args ) throws Exception {
MyClass instance = new MyClass ();
// ν΄λμ€ μ 보 κ°μ Έμ€κΈ°
Class <?> clazz = MyClass .class ;
// νλμ μ κ·Όνμ¬ κ° μ€μ νκΈ°
Field field = clazz .getDeclaredField ("myField" );
field .setAccessible (true ); // μ κ·Ό κΆν μ€μ
field .set (instance , "New Value" );
// λ©μλ νΈμΆνκΈ°
Method method = clazz .getDeclaredMethod ("myMethod" );
method .setAccessible (true );
method .invoke (instance );
}
}
class MyClass {
private String myField ;
private void myMethod () {
System .out .println ("My Method." );
}
}
MyClass ν΄λμ€μ νλ(myField)μ λ©μλ(myMethod)μ μ κ·Όνμ¬ κ°μ μ€μ νκ³ λ©μλλ₯Ό νΈμΆνλ€.
Class κ°μ²΄λ₯Ό μ¬μ©νμ¬ ν΄λμ€ μ 보λ₯Ό κ°μ Έμ€κ³ , Fieldμ Method κ°μ²΄λ₯Ό μ¬μ©νμ¬ νλμ λ©μλμ μ κ·Όνλ€.
setAccessible(true)λ‘ μ κ·Ό κΆνμ μ€μ ν΄μΌ private λ©€λ²μ μ κ·Ό κ°λ₯νλ€.