...

μλ°μ Class ν΄λμ€ (Java.lang.Class)
μλ° νλ‘κ·Έλλ°μ ν λ μ°λ¦¬λ λ³΄ν΅ λ³μλ ν΄λμ€λ₯Ό μ§μ μ μΈνκ³ λ§λ€μ΄ μ¬μ©νμ¬ μλ€. κ·Έλ°λ° μ΄λ€ κ²½μ°μλ μ ν리μΌμ΄μ μ€ν μ€μμ ν΄λμ€λ₯Ό λμ μΌλ‘ λΆλ¬μ λ€λ£¨μ΄μΌ ν κ²½μ°κ° μκΈ΄λ€. μ¦, μ½λλ₯Ό μ€ννκΈ°μ μ»΄νμΌ λ¨μμ κ°λ°μκ° μ§μ ν΄λλ₯Ό λ€μ Έκ°λ©° ν΄λμ€ μ μλ¬Έμ μ°Ύμ ν΄λμ€ μ 보λ₯Ό μ»λ κ²μ΄ μλ, μ½λ μμμ νΈμΆ λ‘μ§μ ν΅ν΄ ν΄λμ€ μ 보λ₯Ό μ»μ΄μ λ€λ£ΈμΌλ‘μ¨ λ°νμ λ¨μμ λ€μ΄λλ―Ήνκ² ν΄λμ€λ₯Ό νΈλ€λ§ νλ κ²μ΄λ€. μ΄λ μ¬μ©λλ κ²μ΄ λ°λ‘ Class ν΄λμ€ κ°μ²΄μ΄λ€.
Class ν΄λμ€λ java.lang.Class ν¨ν€μ§μ λ³λλ‘ μ‘΄μ¬νλ λ 립ν ν΄λμ€λ‘μ, μμ μ΄ μν ν΄λμ€μ λͺ¨λ λ©€λ² μ 보λ₯Ό λ΄κ³ μκΈ° λλ¬Έμ λ°νμ νκ²½μμ λμ μΌλ‘ μ μ₯λ ν΄λμ€λ μΈν°νμ΄μ€ μ 보λ₯Ό κ°μ Έμ€λλ° μ¬μ©λλ€. μ¬κΈ°μ μ€ν΄νμ§ λ§μμΌ ν κ²μ΄ ν΄λμ€ μλ£νμ λ§νλκ² μλλΌ ν΄λμ€ μ΄λ¦μ΄ "Class" μΈ ν΄λμ€λ₯Ό λ§νλ κ²μ΄λ€.

μλ°μ λͺ¨λ ν΄λμ€μ μΈν°νμ΄μ€λ μ»΄νμΌ ν .java β .class νμΌλ‘ λ³νλλ€. μ΄ .class νμΌμλ λ©€λ²λ³μ, λ©μλ, μμ±μ λ± κ°μ²΄μ μ 보λ€μ΄ λ€μ΄ μλλ°, JVMμ ν΄λμ€ λ‘λ(ClassLoader)μ μν΄μ ν΄λμ€ νμΌμ΄ λ©λͺ¨λ¦¬μ μ¬λΌκ° λ, Class ν΄λμ€λ μ΄ .class νμΌμ ν΄λμ€ μ 보λ€μ κ°μ Έμ ν μμμ μλμΌλ‘ κ°μ²΄νκ° λκ² λλ€. κ·Έλμ λ°λ‘ new μΈμ€ν΄μ€ν μμ΄ λ°λ‘ κ°μ Έμ μ¬μ©νλ©΄ λλ€.

JVMμ ν΄λμ€ λ‘λ(class loader)λ μ€ν μμ νμν ν΄λμ€λ₯Ό λμ μΌλ‘ λ©λͺ¨λ¦¬μ λ‘λνλ μν μ νλ€.
λ¨Όμ κΈ°μ‘΄μ μμ±λ ν΄λμ€ κ°μ²΄κ° λ©λͺ¨λ¦¬μ μ‘΄μ¬νλμ§ νμΈνκ³ μμΌλ©΄ κ°μ²΄μ μ°Έμ‘°λ₯Ό λ°ννκ³ , μμΌλ©΄ classpathμ μ§μ λ κ²½λ‘λ₯Ό λ°λΌμ ν΄λμ€ νμΌμ μ°Ύμ ν΄λΉ ν΄λμ€ νμΌμ μ½μ΄μ Class κ°μ²΄λ‘ λ³ννλ€.
λ§μΌ λͺ» μ°ΎμΌλ©΄ μ°λ¦¬κ° μ΅νμλ ClassNotFoundException μμΈλ₯Ό λμ°κ² λλ€.
Class ν΄λμ€ κ°μ²΄ μ»κΈ°
μλ°μμ Class κ°μ²΄λ₯Ό κ°μ Έμ€λ λ°©λ²μ μ΄ 3κ°μ§κ° μ‘΄μ¬νλ€. κ°μ²΄λ₯Ό κ°μ Έμ€λ κ²μ λκ°μ§λ§ κ°κΈ° λ°©μμ λ°λΌ μ°¨μ΄κ° μ‘΄μ¬νλ λͺ¨λ μμλ νμκ° μλ€.
λ€μμ μ°λ¦¬κ° μ΅νμλ String ν΄λμ€ κ°μ²΄λ₯Ό μμ±νκ³ , μΈκ°μ§ λ°©λ²μΌλ‘ String ν΄λμ€μ Class ν΄λμ€ μ 보λ₯Ό μ»λ μμμ΄λ€.
Object.getClass() λ‘ μ»κΈ°
- λͺ¨λ ν΄λμ€μ μ΅μμ ν΄λμ€μΈ Object ν΄λμ€μμ μ 곡νλ
getClass()λ©μλλ₯Ό ν΅ν΄ κ°μ Έμ¨λ€. - λ¨, ν΄λΉ ν΄λμ€κ° μΈμ€ν΄μ€ν λ μν μ΄μ΄μΌ νλ€λ μ μ½μ΄ μλ€.
public static void main(String[] args) {
// μ€νΈλ§ ν΄λμ€ μΈμ€ν΄μ€ν
String str = new String("Classν΄λμ€ ν
μ€νΈ");
// getClass() λ©μλλ‘ μ»κΈ°
Class<? extends String> cls = str.getClass();
System.out.println(cls); // class java.lang.String
}
.class 리ν°λ΄λ‘ μ»κΈ°
- μΈμ€ν΄μ€κ° μ‘΄μ¬νμ§ μκ³ , μ»΄νμΌλ ν΄λμ€ νμΌλ§ μλ€λ©΄ 리ν°λ΄λ‘ Class κ°μ²΄λ₯Ό 곧λ°λ‘ μ»μ μ μλ€.
- κ°μ₯ μ¬ννκ² Class κ°μ²΄λ₯Ό κ°μ Έμ€λ λ°©λ²μ΄λ€.
public static void main(String[] args) {
// ν΄λμ€ λ¦¬ν°λ΄(*.class)λ‘ μ»κΈ°
Class<? extends String> cls2 = String.class;
System.out.println(cls2); // class java.lang.String
}
Class.forName() μΌλ‘ μ»κΈ°
- μμ 리ν°λ΄ λ°©μκ³Ό κ°μ΄ μ»΄νμΌλ ν΄λμ€ νμΌμ΄ μλ€λ©΄ ν΄λμ€ μ΄λ¦λ§μΌλ‘ Class κ°μ²΄λ₯Ό λ°ν λ°μ μ μλ€.
- λ¨, μ΄λλ ν΄λμ€μ λλ©μΈμ μμΈν μ μ΄μ£Όμ΄μΌ νλ€. κ·Έλμ ν΄λμ€ νμΌ κ²½λ‘μ μ€νκ° μμΌλ©΄ μλ¬κ° λ°μν μ μκΈ° λλ¬Έμ μ£Όμν΄μΌνλ€. (λμλ¬Έμ μ€μ λ±)
- λ§μΌ Class κ°μ²΄λ₯Ό μ°Ύμ§ λͺ»νλ€λ©΄
ClassNotFoundExceptionλ₯Ό λ°μ μν€κΈ° λλ¬Έμ μμΈμ²λ¦¬κ° κ°μ λλ€. - κ·Έλ¬λ λ€λ₯Έ λκ°μ§ λ°©λ²λ³΄λ€ forNameμ ν΅ν΄ μ»κ² λλ©΄ λ©λͺ¨λ¦¬λ₯Ό μ μ½νλ©° λμ λ‘λ© ν μ μκΈ° λλ¬Έμ κ°μ₯ μ±λ₯μ΄ μ’λ€.
public static void main(String[] args) {
try {
// λλ©μΈ.ν΄λμ€λͺ
μΌλ‘ μ»κΈ°
Class<?> cls3 = Class.forName("java.lang.String");
System.out.println(cls3); // class java.lang.String
} catch (ClassNotFoundException e) {}
}
Class ν΄λμ€ κ°μ²΄λ₯ΌforName()λ©μλλ₯Ό ν΅ν΄ κ°μ Έμ€λ λ°©λ²μ 'λμ λ‘λ©'μ΄λΌκ³ λΆλ₯Έλ€. λ³΄ν΅ λ€λ₯Έ ν΄λμ€ νμΌμ λΆλ¬μ¬λλ μ»΄νμΌ μ JVMμ Method Areaμ ν΄λμ€ νμΌμ΄ κ°μ΄ λ°μΈλ©(binding)μ΄ λμ§λ§,forName()μΌλ‘ .classνμΌμ λΆλ¬μ¬ λλ μ»΄νμΌμ λ°μΈλ©μ΄ λμ§μκ³ λ°νμλ λΆλ¬μ€κ² λκΈ° λλ¬Έμ λμ λ‘λ©μ΄λΌκ³ λΆλ₯Έλ€.
κ·Έλμ μ»΄νμΌ νμ μ μ²΄ν¬ ν μ μκΈ° λλ¬Έμ ν΄λμ€ μ λ¬΄κ° νμΈλμ§ μμ μμΈ μ²λ¦¬λ₯Ό ν΄μ£Όμ΄μΌ νλ μ΄μ μ΄κΈ°λ νλ€.
λλΆλΆμ ν΄λμ€ μ 보λ νλ‘κ·Έλ¨μ΄ λ‘λ©λ λ μ΄λ―Έ Method Area λ©λͺ¨λ¦¬μ μ μ¬λλ€.
κ·Έλ°λ° μ΄λ€ μμ€ν μ μ€λΌν΄, MySQL, SQL Server λ± μ¬λ¬ μ’ λ₯μ λ°μ΄ν°λ² μ΄μ€μ μ°λν μ μλ€κ³ νλλ°, κ·Έλ λ€κ³ μ΄ μμ€ν μ μ»΄νμΌν λ λͺ¨λ λ°μ΄ν°λ² μ΄μ€μ λΌμ΄λΈλ¬λ¦¬(λλΌμ΄λ²)λ₯Ό κ°μ΄ μ»΄νμΌν νμλ μλ€. μμ€ν μ ꡬλν λ μ΄λ€ DBμ μ°κ²°ν μ§ κ²°μ λλ©΄ ν΄λΉ λλΌμ΄λ²λ§ λ‘λ©νλ©΄ λκΈ° λλ¬Έμ΄λ€. μ΄λ΄λforName()μ ν΅ν΄ λ©λͺ¨λ¦¬μ μΌλ‘ μλΌλ©΄μ ν΄λμ€λ₯Ό λμ μΌλ‘ λ‘λ©νλ©΄ μ’λ€.
Class ν΄λμ€ λ©μλ μ’ λ₯

String getName(): ν΄λμ€μ μ΄λ¦μ 리ν΄νλ€.Package getPackage(): ν΄λμ€μ ν¨ν€μ§ μ 보λ₯Ό ν¨ν€μ§ ν΄λμ€ νμ μΌλ‘ 리ν΄νλ€.Field[] getFields(): publicμΌλ‘ μ μΈλ λ³μ λͺ©λ‘μ Field ν΄λμ€ λ°°μ΄ νμ μΌλ‘ 리ν΄νλ€.Field getField(String name): publicμΌλ‘ μ μΈλ λ³μλ₯Ό Field ν΄λμ€ νμ μΌλ‘ 리ν΄νλ€.Field[] getDeclaredFields(): ν΄λΉ ν΄λμ€μμ μ μλ λ³μ λͺ©λ‘μ field ν΄λμ€ λ°°μ΄ νμ μΌλ‘ 리ν΄νλ€.Field getDeclaredField(String name): nameκ³Ό λμΌν μ΄λ¦μΌλ‘ μ μλ λ³μλ₯Ό Field ν΄λμ€ νμ μΌλ‘ 리ν΄νλ€.Method[] getMethods(): publicμΌλ‘ μ μΈλ λͺ¨λ λ©μλ λͺ©λ‘μ Method ν΄λμ€ λ°°μ΄ νμ μΌλ‘ 리ν΄νλ€. ν΄λΉ ν΄λμ€μμ μ¬μ© κ°λ₯ν μμλ°μ λ©μλλ ν¬ν¨λλ€.Method getMethod(String name, Class... parameterTypes): μ§μ λ μ΄λ¦κ³Ό 맀κ°λ³μ νμ μ κ°λ λ©μλλ₯Ό Method ν΄λμ€ νμ μΌλ‘ 리ν΄νλ€.Method[] getDeclaredMethods(): ν΄λΉ ν΄λμ€μμ μ μΈλ λͺ¨λ λ©μλ μ 보λ₯Ό 리ν΄νλ€.Method getDeclaredMethod(String name, Class... parameterTypes): μ§μ λ μ΄λ¦κ³Ό 맀κ°λ³μ νμ μ κ°λ ν΄λΉ ν΄λμ€μμ μ μΈλ λ©μλλ₯Ό Method ν΄λμ€ νμ μΌλ‘ 리ν΄νλ€.Constructor[] getConstructors(): ν΄λΉ ν΄λμ€μ μ μΈλ λͺ¨λ public μμ±μμ μ 보λ₯Ό Constructor λ°°μ΄ νμ μΌλ‘ 리ν΄νλ€.Constructor[] getDeclaredConstructors(): ν΄λΉ ν΄λμ€μμ μ μΈλ λͺ¨λ μμ±μμ μ 보λ₯Ό Constructor λ°°μ΄ νμ μΌλ‘ 리ν΄νλ€.int getModifiers(): ν΄λΉ ν΄λμ€μ μ κ·Όμ(modifier) μ 보λ₯Ό int νμ μΌλ‘ 리ν΄νλ€.String toString(): ν΄λΉ ν΄λμ€ κ°μ²΄λ₯Ό λ¬Έμμ΄λ‘ 리ν΄νλ€.
ν΄λμ€ μ 보 μΆλ ₯νκΈ°
Class ν΄λμ€ κ°μ²΄μλ μμ μ΄ μν ν΄λμ€μ κ°μ’ λ©€λ² μ 보λ€μ΄ λ€μ΄μλ€κ³ νμλ€. μ΄λ κ² λ°μμ¨ Class κ°μ²΄λ₯Ό μ΄μ©νμ¬ μμ μ΄ μν ν΄λμ€μ μ 보λ₯Ό μΆλ ₯ν μ μλ€.
public static void main(String[] args) {
// String κ°μ²΄λ‘λΆν° ν΄λμ€ μ 보λ₯Ό μ»λλ€
Class<? extends String> cls = String.class;
// ν΄λμ€μ μ΄λ¦λ§ νΈμΆνλ€.
System.out.println("1. " + cls.getSimpleName()); // 1. String
// ν¨ν€μ§μ μ΄λ¦μ νΈμΆνλ€.
System.out.println("2. " + cls.getPackage()); // 2. package java.lang
// ν¨ν€μ§μ μ΄λ¦μ νΈμΆνλ€.
System.out.println("3. " + cls.getName()); // 3. java.lang.String
// ν΄λμ€μ ν¨ν€μ§ μ΄λ¦μ νΈμΆνλ€.
System.out.println("4. " + cls.toString()); // 4. class java.lang.String
// μ μ΄μλΆν° ν¨ν€μ§ μ΄λ¦ λͺ¨λλ€ νΈμΆνλ€.
System.out.println("5. " + cls.toGenericString()); // 5. public final class java.lang.String
}

ν΄λμ€ κ΅¬μ± μΆλ ₯νκΈ°
public static void main(String[] args) {
Class<? extends String> cls = String.class;
// κ°μ§κ³ μλ νλλ₯Ό λͺ¨λ μΆλ ₯νλ€.
System.out.println("6. " + Arrays.toString(cls.getFields())); // 6. [public static final java.util.Comparator java.lang.String.CASE_INSENSITIVE_ORDER]
// κ°μ§κ³ μλ λ©μλλ₯Ό λͺ¨λ νΈμΆνλ€.
System.out.println("7. " + Arrays.toString(cls.getMethods())); // 7. [public boolean java.lang.String.equals(java.lang.Object), public java.lang.String java.lang.String.toString() ...]
// μΈν°νμ΄μ€ λͺ©λ‘μ λͺ¨λ κ°μ Έμ¨λ€.
System.out.println("8. " + Arrays.toString(cls.getInterfaces())); // 8. [interface java.io.Serializable, interface java.lang.Comparable, interface java.lang.CharSequence]
// super ν΄λμ€λ₯Ό κ°μ Έμ¨λ€
System.out.println("9. " + cls.getSuperclass()); // 9. class java.lang.Object
}

Reflection API κΈ°λ²
λ°λ‘ μμμ λ΄€λ―μ΄, Class κ°μ²΄λ₯Ό μ΄μ©νλ©΄ ν΄λμ€μ λν λͺ¨λ μ 보(ν΄λμ€μ μ μλ λ©€λ²μ μ΄λ¦μ΄λ κ°μ λ±)λ₯Ό λ°νμ λ¨μμ μ½λ λ‘μ§μΌλ‘ μ»μ μ μλ€λ κ²μ μμλ€.
ν΄λμ€ μ 보λ€μ μ€νλΆμμ μ»μ μ μλ μ μ κ½€λ 맀λ ₯μ μΈλ°, μ΄λ¬ν μ 보λ€μ μ΄μ©νμ¬ μ€λ‘μ§ Class κ°μ²΄λ§μΌλ‘ λ³Έ ν΄λμ€λ₯Ό μΈμ€ν΄μ€ν ν μ μκ³ , λ©μλλ₯Ό νΈμΆ ν μ μλ ..λ± λ³΄λ€ λμ μΈ μ½λλ₯Ό μμ±ν μ μκ² λλ€. μ΄μ²λΌ ꡬ체μ μΈ ν΄λμ€ νμ μ μμ§ λͺ»ν΄λ κ·Έ ν΄λμ€μ μ 보(λ©μλ, νμ , λ³μ, ...)μ μ κ·Όν μ μκ² ν΄μ£Όλ μλ° κΈ°λ²μ Reflection API λΌκ³ λΆλ₯Έλ€.
μλ° λ¦¬νλ μ (Reflection - μ¬μ μ μλ―Έ : κ±°μΈ λ±μ λΉμΉ, λ°μ¬)μ κ°μ²΄λ₯Ό ν΅ν΄ ν΄λμ€μ μ 보λ₯Ό λΆμνμ¬ λ°νμμ ν΄λμ€μ λμμ κ²μ¬νκ±°λ μ‘°μνλ νλ‘κ·Έλ¨ κΈ°λ²μ΄λ€. ν΄λμ€ νμΌμ μμΉλ μ΄λ¦λ§ μλ€λ©΄ ν΄λΉ ν΄λμ€μ μ 보λ₯Ό μ»μ΄λ΄κ³ , κ°μ²΄λ₯Ό μμ±νλ κ² λν κ°λ₯νκ² ν΄μ£Όμ΄ μ μ°ν νλ‘κ·Έλλ°μ κ°λ₯μΌ ν΄μ€λ€.

리νλ μ μ μ ν리μΌμ΄μ κ°λ°μμ보λ€λ νλ μμν¬, λΌμ΄λΈλ¬λ¦¬μμ λ§μ΄ μ¬μ©λλ€. μλνλ©΄ νλ μμν¬, λΌμ΄λΈλ¬λ¦¬λ μ¬μ©νλ μ¬λμ΄ μ΄λ€ ν΄λμ€λͺ κ³Ό λ©€λ²λ€μ ꡬμ±ν μ§ λͺ¨λ₯΄λλ°, μ΄λ¬ν μ¬μ©μ ν΄λμ€λ€μ κΈ°μ‘΄μ κΈ°λ₯κ³Ό λμ μΌλ‘ μ°κ²° μν€κΈ° μνμ¬ λ¦¬νλ μ μ μ¬μ©νλ€κ³ 보면 λλ€. λνμ μΈ μλ‘λ μ€νλ§μ DI(dpendency injection), Proxy, ModelMapper λ±μ΄ μλ€. μ΄λ―Έ Spring, Hibernate, Lombok λ± λ§μ νλ μμν¬μμ Reflection κΈ°λ₯μ μ¬μ©νκ³ μλ€.
μλ° λ¦¬νλ μ μ¬μ©λ²
λ€μμ 리νλ μ μμ μ μ°μΌ μ€λΉλ¬Ό ν΄λμ€μ΄λ€. Person ν΄λμ€μλ publicκ³Ό private, staticν νλμ λ©μλλ₯Ό κ°μ§κ³ μμΌλ©°, μμ±μλ μκ·λ¨ΌνΈμ λ°λΌ λκ°μ§λ‘ μ€λΉνμλ€. μ΄μ μ΄ λ³΅μ‘νκ² κ΅¬μ±λμ΄ μλ Person ν΄λμ€μ λ©€λ² μ 보λ€μ 리νλ μ μΌλ‘ λμ μΌλ‘ λΆλ¬μ μ΄λ»κ² λ€μ΄λλ―Ήνκ² λ€λ£°μ μλμ§ μ²΄νν΄λ³΄μ.
// νμ ν¨ν€μ§ λ‘λ
import java.lang.reflect.*;
class Person {
public String name; // public νλ
private int age; // private νλ
public static int height = 180; // static νλ
// μ΄λ¦, λμ΄λ₯Ό μ
λ ₯λ°λ μμ±μ
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// κΈ°λ³Έ μμ±μ
public Person() {
}
public void getField() {
System.out.printf("μ΄λ¦ : %s, λμ΄ : %d\n", name, age);
}
// public λ©μλ
public int sum(int left, int right) {
return left + right;
}
// static λ©μλ
public static int staticSum(int left, int right) {
return left + right;
}
// private λ©μλ
private int privateSum(int left, int right) {
return left + right;
}
}
λμ μΌλ‘ μμ±μ κ°μ Έμ μ΄κΈ°ννκΈ°
getConstructor()λ₯Ό νΈμΆν λ μΈμλ‘ μμ±μμ 맀κ°λ³μ νμ μ λ°μΈλ© ν΄μ£Όμ΄μΌ νλ€.- λ§μΌ μ΄λ ν 맀κ°λ³μ νμ μ μ§μ ν΄μ£Όμ§ μμΌλ©΄ κΈ°λ³Έ μμ±μκ° νΈμΆλκ² λλ€.
- λ§μ½ ν΄λΉνλ μμ±μλ₯Ό μ°Ύμ§ λͺ»νλ©΄ NoSuchMethodExceptionμ΄ λ°μλλ€.
public static void main(String[] args) throws Exception {
// ν΄λμ€ κ°μ²΄ κ°μ Έμ€κΈ° (forName λ©μλ λ°©μ)
Class<Person> personClass = (Class<Person>) Class.forName("Person");
// μμ±μ κ°μ Έμ€κΈ° - Person(String name, int age)
Constructor<Person> constructor = personClass.getConstructor(String.class, int.class); // getConstructor μΈμλ‘ μμ±μμ 맀κ°λ³μ νμ
μ λ°μΈλ© ν΄μ£Όμ΄μΌ νλ€.
// κ°μ Έμ¨ μμ±μλ‘ μΈμ€ν΄μ€ λ§λ€κΈ°
Person person1 = constructor.newInstance("νκΈΈλ", 55);
person1.getField(); // μ΄λ¦ : νκΈΈλ, λμ΄ : 55
}
λμ μΌλ‘ λ©μλ κ°μ Έμ μ€ννκΈ°
getMethod()λ₯Ό νΈμΆν λ μΈμλ‘ μμ±μμ 맀κ°λ³μ νμ μ λ°μΈλ© ν΄μ£Όμ΄μΌ νλ€.- λ§μ½ 맀κ°λ³μκ° μλ λ©μλλΌλ©΄ λ©μλ λͺ λ§ μ λ ₯ν΄μ£Όλ©΄ λλ€.
- μ€νμ Method νμ
μμ μ 곡νλ
invoke()λ₯Ό νΈμΆνμ¬ μ€ννλ©΄ λλ€.- instance λ©μλ - 맀κ°λ³μλ‘ μΈμ€ν΄μ€ νμ
- static λ©μλ - 맀κ°λ³μ νμ μμ
- private λ©μλ - invoke νκΈ°μ μ 곡κ°ν ν νμμμ
public static void main(String[] args) throws Exception {
Class<Person> personClass = (Class<Person>) Class.forName("Person");
// νΉμ public λ©μλ κ°μ Έμ μ€ν
// getMethod("λ©μλλͺ
", 맀κ°λ³μνμ
λ€)
Method sum = personClass.getMethod("sum", int.class, int.class);
int result = (int) sum.invoke(new Person(), 10, 20);
System.out.println("result = " + result); // 30
// νΉμ static λ©μλ κ°μ Έμ μ€ν
Method staticSum = personClass.getMethod("staticSum", int.class, int.class);
int staticResult = (int) staticSum.invoke(null, 100, 200);
System.out.println("staticResult = " + staticResult); // 300
// νΉμ private λ©μλ κ°μ Έμ μ€ν
Method privateSum = personClass.getDeclaredMethod("privateSum", int.class, int.class);
privateSum.setAccessible(true); // private μ΄κΈ° λλ¬Έμ μΈλΆμμ access ν μ μλλ‘ μ€μ
int privateResult = (int) privateSum.invoke(new Person(), 1000, 2000);
System.out.println("privateResult = " + privateResult); // 3000
}
λμ μΌλ‘ νλ κ°μ Έμ μ‘°μνκΈ°
getField()λ₯Ό ν΅ν΄ ν΄λμ€μ νλλ₯Ό μ»μ μ μλ€.- νλ κ° λ³κ²½μ
set()λ©μλλ₯Ό νΈμΆνλ©΄ λλ€. - νλλ ν΄λμ€κ° μΈμ€ν΄μ€κ° λμ΄μΌ Heap λ©λͺ¨λ¦¬μ μ μ¬λ¨μΌλ‘ μΈμ€ν΄μ€κ° νμνλ€.
- λ€λ§, static νλλΌλ©΄ Method Areaμ μ΄λ―Έ μ μ¬λμ΄ μμΌλ―λ‘ μΈμ€ν΄μ€κ° νμμλ€.
public static void main(String[] args) throws Exception {
Class<Person> personClass = (Class<Person>) Class.forName("Person");
// static νλλ₯Ό κ°μ Έμ μ‘°μνκ³ μΆλ ₯νκΈ°
Field height_field = personClass.getField("height");
height_field.set(null, 200);
System.out.println(height_field.get(null)); // 200
}
public static void main(String[] args) throws Exception {
Person person = new Person("νκΈΈλ", 55);
// ν΄λμ€ κ°μ²΄ κ°μ Έμ€κΈ°
Class<Person> personClass = (Class<Person>) Class.forName("Person");
// public νλλ₯Ό κ°μ Έμ¨λ€.
Field name_field = personClass.getField("name");
// private νλλ₯Ό κ°μ Έμ¨λ€.
Field age_field = personClass.getDeclaredField("age");
age_field.setAccessible(true); // private μ΄κΈ° λλ¬Έμ μΈλΆμμ access ν μ μλλ‘ μ€μ
// νλ μ‘°μνκΈ°
name_field.set(person, "μκΊ½μ ");
age_field.set(person, 88);
System.out.println(name_field.get(person)); // μκΊ½μ
System.out.println(age_field.get(person)); // 200
}
μ΄λ κ² λ¦¬νλ μ
μ μ¬μ©νλ©΄ ν΄λμ€μ λ©μλμ λ©νμ 보λ₯Ό μ¬μ©ν΄μ μ ν리μΌμ΄μ
μ λμ μΌλ‘ μ μ°νκ² λ§λ€ μ μλ€. νμ§λ§ 리νλ μ
κΈ°μ μ λ°νμμ λμνκΈ° λλ¬Έμ, μ»΄νμΌ μμ μ μ€λ₯λ₯Ό μ‘μ μ μλ€λ λ¨μ μ΄ μ‘΄μ¬νλ€.
λ§μΌ 리νλ μ
μΌλ‘ getMethod("λ©μλλͺ
") λ₯Ό ν΅ν΄ ν΄λμ€μ λ©μλλ₯Ό κ°μ Έμ¨λ€κ³ κ°μ νμ λ μΈμλ‘ μ‘΄μ¬νμ§λ μλ λ©μλλͺ
μ κΈ°μ¬ν κ²½μ°, ν΄λΉ μ½λλ₯Ό μ§μ μ€νν΄μΌ μ€λ₯κ° λ°μν΄ λ―Έλ¦¬ λλΉν μ μκ² λλ€.
κ°μ₯ μ’μ μ€λ₯λ κ°λ°μκ° μ¦μ νμΈν μ μλ μ»΄νμΌ μ€λ₯μ΄κ³ , κ°μ₯ 무μμ΄ μ€λ₯λ μ¬μ©μκ° μ§μ μ€νν λ λ°μνλ λ°νμ μ€λ₯λ€. λ°λΌμ 리νλ μ
μ μ΄λ³΄μκ° μΌλ°μ μΌλ‘ μ¬μ©νλλ°λ μ μν΄μΌνλ€.
# μ°Έκ³ μλ£
https://www.youtube.com/watch?v=Mc6OaicCZVA
https://www.youtube.com/watch?v=NI6QZy6juc8
https://12bme.tistory.com/129
μ΄ κΈμ΄ μ’μΌμ ¨λ€λ©΄ ꡬλ & μ’μμ
μ¬λ¬λΆμ ꡬλ
κ³Ό μ’μμλ
μ μμκ² ν° νμ΄ λ©λλ€.