item 65 sijun - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
리νλ μ (java.lang.reflect)λ₯Ό μ΄μ©νλ©΄ νλ‘κ·Έλ¨μμ μμμ ν΄λμ€μ μ κ·Όν μ μλ€. Class κ°μ²΄κ° μ£Όμ΄μ§λ©΄ κ·Έ ν΄λμ€μ μμ±μ, λ©μλ, νλμ ν΄λΉνλ Consturctor, Method, Field μΈμ€ν΄μ€λ₯Ό κ°μ Έμ¬ μ μκ³ , μ΄μ΄μ μ΄ μΈμ€ν΄μ€λ€λ‘λ κ·Έ ν΄λμ€μ λ©€λ² μ΄λ¦, νλ νμ , λ©μλ μκ·Έλμ² λ±μ κ°μ Έμ¬ μ μλ€. λμκ° Consturctor, Method, Field μΈμ€ν΄μ€λ₯Ό μ΄μ©ν΄ κ°κ°μ μ°κ²°λ μ€μ μμ±μ, λ©μλ, νλλ₯Ό μ‘°μν μλ μλ€.
public class Test{
public static void main(String[] args) throws Exception {
SampleClass sampleClass = new SampleClass();
Class<SampleClass> cs = SampleClass.class;
Field[] fields = cs.getDeclaredFields(); // field λͺ©λ‘ λ°κΈ°
Method[] methods = cs.getDeclaredMethods(); // method λͺ©λ‘ λ°κΈ°
cs.getConstructors(); // constructor νΈμΆ
for(Field field : fields) {
System.out.println(field.getName());
}
for(Method method : methods) {
method.invoke(sampleClass,(Object[]) null);
}
}
}
class SampleClass{
public int testNum;
public int testNum2;
public SampleClass() {
System.out.println("constructorμ΄ μ€νλμλ€");
}
public void testMethod() {
System.out.println("testMethodμ΄ μ€νλμλ€");
}
}
----------------------------
constructorμ΄ μ€νλμλ€
testNum
testNum2
testMethodμ΄ μ€νλμλ€
리νλ μ μ μ΄μ©νλ©΄ μ»΄νμΌ λΉμμ μ‘΄μ¬νμ§ μλ ν΄λμ€λ μ΄μ©ν μ μλλ°, λ¨μ λ μλ€.
-
μ»΄νμΌνμ νμ κ²μ¬κ° μ£Όλ μ΄μ μ νλλ λ릴 μ μλ€.
μ‘΄μ¬νμ§ μλ νΉμ μ κ·Όν μ μλ λ©μλλ₯Ό νΈμΆνλ € μλνλ©΄ λ°νμ μ€λ₯κ° λ°μνλ€.
-
리νλ μ μ μ΄μ©νλ©΄ μ½λκ° μ§μ λΆνκ³ μ₯ν©ν΄μ§λ€.
-
μ±λ₯μ΄ λ¨μ΄μ§λ€
μ½λ λΆμ λꡬλ μμ‘΄κ΄κ³ μ£Όμ νλ μμν¬μ²λΌ 리νλ μ μ μ¨μΌ νλ 볡μ‘ν μ ν리μΌμ΄μ μ΄ λͺ κ°μ§ μλ€. νμ§λ§ μ΄λ° λꡬλ€λ§μ 리νλ μ μ¬μ©μ μ μ°¨ μ€μ΄κ³ μλ€. λ¨μ μ΄ λͺ λ°±νκΈ° λλ¬Έμ΄λ€.
리νλ μ μ μμ£Ό μ νλ ννλ‘λ§ μ¬μ©ν΄μΌ κ·Έ λ¨μ μ νΌνκ³ μ΄μ λ§ μ·¨ν μ μλ€.
package effectivejava.chapter9.item65;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
import java.util.Set;
// 리νλ μ
μΌλ‘ νμ©ν μΈμ€ν΄μ€ν λ°λͺ¨
public class ReflectiveInstantiation {
// μ½λ 65-1 리νλ μ
μΌλ‘ μμ±νκ³ μΈν°νμ΄μ€λ‘ μ°Έμ‘°ν΄ νμ©νλ€. (372-373μͺ½)
public static void main(String[] args) {
// ν΄λμ€ μ΄λ¦μ Class κ°μ²΄λ‘ λ³ν
Class<? extends Set<String>> cl = null;
try {
cl = (Class<? extends Set<String>>) // λΉκ²μ¬ νλ³ν!
Class.forName(args[0]);
} catch (ClassNotFoundException e) {
fatalError("ν΄λμ€λ₯Ό μ°Ύμ μ μμ΅λλ€.");
}
// μμ±μλ₯Ό μ»λλ€.
Constructor<? extends Set<String>> cons = null;
try {
cons = cl.getDeclaredConstructor();
} catch (NoSuchMethodException e) {
fatalError("맀κ°λ³μ μλ μμ±μλ₯Ό μ°Ύμ μ μμ΅λλ€.");
}
// μ§ν©μ μΈμ€ν΄μ€λ₯Ό λ§λ λ€.
Set<String> s = null;
try {
s = cons.newInstance();
} catch (IllegalAccessException e) {
fatalError("μμ±μμ μ κ·Όν μ μμ΅λλ€.");
} catch (InstantiationException e) {
fatalError("ν΄λμ€λ₯Ό μΈμ€ν΄μ€νν μ μμ΅λλ€.");
} catch (InvocationTargetException e) {
fatalError("μμ±μκ° μμΈλ₯Ό λμ‘μ΅λλ€: " + e.getCause());
} catch (ClassCastException e) {
fatalError("Setμ ꡬννμ§ μμ ν΄λμ€μ
λλ€.");
}
// μμ±ν μ§ν©μ μ¬μ©νλ€.
s.addAll(Arrays.asList(args).subList(1, args.length));
System.out.println(s);
}
private static void fatalError(String msg) {
System.err.println(msg);
System.exit(1);
}
}
μ μ½λλ λ κ°μ§ λ¨μ μ 보μ¬μ€λ€.
- λ°νμμ μ΄ μ¬μ―κ°μ§λ λλ μμΈλ₯Ό λμ§ μ μλ€.
- ν΄λμ€ μ΄λ¦λ§μΌλ‘ μΈμ€ν΄μ€λ₯Ό μμ±ν΄λ΄κΈ° μν΄ λ¬΄λ € 25μ€μ΄λ λλ μ½λλ₯Ό μμ±νλ€.
κ°μ²΄κ° μΌλ¨ λ§λ€μ΄μ§λ©΄ κ·Έ νμ μ½λλ μ¬νμ Set μΈμ€ν΄μ€λ₯Ό μ¬μ©ν λμ λκ°λ€.
리νλ μ μ λ°νμμ μ‘΄μ¬νμ§ μμ μλ μλ λ€λ₯Έ ν΄λμ€, λ©μλ, νλμμ μμ‘΄μ±μ κ΄λ¦¬ν λ μ ν©νλ€.
μ΄ κΈ°λ²μ λ²μ μ΄ μ¬λ¬ κ° μ‘΄μ¬νλ μΈλΆ ν¨ν€μ§λ₯Ό λ€λ£° λ μ μ©νλ€. κ°λν μ μλ μ΅μνμ νκ²½, μ¦ μ£Όλ‘ κ°μ₯ μ€λλ λ²μ λ§μ μ§μνλλ‘ μ»΄νμΌν ν, μ΄ν λ²μ μ ν΄λμ€μ λ©μλ λ±μ 리νλ μ μΌλ‘ μ κ·Όνλ λ°©μμ΄λ€.
μ΄λ κ² νλ €λ©΄ μ κ·Όνλ €λ μλ‘μ΄ ν΄λμ€λ λ©μλκ° λ°νμμ μ‘΄μ¬νμ§ μμ μ μλ€λ μ¬μ€μ λ°λμ κ°μν΄μΌνλ©°, λ체 μλ¨μ΄λ κΈ°λ₯μ λ§λ€μ΄μΌ νλ€.
리νλ μ μ 볡μ‘ν νΉμ μμ€ν μ κ°λ°ν λ νμν κ°λ ₯ν κΈ°λ₯μ΄μ§λ§, λ¨μ λ λ§λ€. μ»΄νμΌνμμλ μ μ μλ ν΄λμ€λ₯Ό μ¬μ©νλ νλ‘κ·Έλ¨μ μμ±νλ€λ©΄ 리νλ μ μ μ¬μ©ν΄μΌ ν κ²μ΄λ€. λ¨, λλλ‘ κ°μ²΄ μμ±μλ§ μ¬μ©νκ³ , μμ±ν κ°μ²΄λ₯Ό μ΄μ©ν λλ μ μ ν μΈν°νμ΄μ€λ μ»΄νμΌνμμ μ μ μλ μμ ν΄λμ€λ‘ νλ³νν΄ μ¬μ©ν΄μΌ νλ€.