item 65 SeungminLee - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
Effective Java 3e μμ΄ν 65λ₯Ό μμ½ν λ΄μ©μ λλ€.
리νλμ
(java.lang.reflect)λ₯Ό μ΄μ©νλ©΄ μ»΄νμΌ νμμ μ μ μλ μμμ ν΄λμ€κΉμ§ μ κ·Όμ ν μ μλ€. μμ±μ
μ λ©μλ
λ₯Ό κ°μ Έμ¬ μ μμΌλ©° λ§΄λ² μ΄λ¦
, νλ νμ
λ κ°μ Έμ¬ μ μλ€.
κ°μ Έμ€λ κ² λΏλ§ μλλΌ μμ±μ, λ©μλ, νλλ₯Ό μ€μ λ‘ μ΄μ©ν μ μλ€. μλ₯Ό λ€μ΄ Method.invoke()
λ₯Ό μ΄μ©ν΄μ λΈλ¬λ€μΈ λ©μλλ₯Ό μ¬μ©ν μ μλ€.
//ex1
TestClass testClass = new TestClass(); // TestClass μμ testClassMethodκ° μλ€κ³ κ°μ
Class reClass = testClass.getClass();
Method[] m = reClass.getDeclaredMethods();
for (int i = 0 ; i < m.length ; i++) {
if (m.getName().compareTo("testClassMethod") == 0 &&
m.getParameterTypes().length == 1) {
Object[] param = new Object[] {"μΈμκ°" };
m.invoke(testClass, param); //λ©μλλ₯Ό νΈμΆν κ°μ²΄,νΈμΆν λ©μλμ μ λ¬ν νλΌλ©ν°
}
}
//ex2
Method[] m = TestClass.class.getDeclaredMethods() // ex1κ³Ό λμΌν κ²°κ³Όκ° λμ¨λ€.
-
μ»΄νμΌνμ νμ
κ²μ¬κ° μ£Όλ μ΄μ μ νλλ λ릴 μ μλ€.
μ‘΄μ¬νμ§ μλ ν΄λμ€, λ©μλλ₯Ό νΈμΆν΄λ μ»΄νμΌνμ κ²μ¬μμλ λ°κ²¬νμ§ λͺ»ν΄ λ°νμ μ€λ₯κ° λ°μνλ€. - 리νλ μ μ μ΄μ©νλ©΄ μ½λκ° μ§μ λΆνκ³ μ₯ν©ν΄μ§λ€
-
μ±λ₯μ΄ λ¨μ΄μ§λ€
리νλ μ μ μ΄μ©ν λ©μλ νΈμΆμ μΌλ° λ©μλ νΈμΆλ³΄λ€ ν¨μ¬ λ리λ€. 맀κ°λ³μκ° μμ΄ intλ₯Ό λ°ννλ λ©μλλ 리νλ μ μ μ΄μ©νλ©΄ 11λ°°λ λλ €μ‘λ€.
리νλ μ
μ μ¨μΌνλ 볡μ‘ν μ΄ν리μΌμ΄μ
(ex μ½λ λΆμ λꡬ, μμ‘΄κ΄κ³ μ£Όμ
νλ μμν¬)μμ 리νλ μ
μ΄ μ°μ΄κΈ°λ νλ
μ μ°¨ μ¬μ©μ μ€μκ°λ μΆμΈμ΄λ€. 리νλ μ
μ μμ£Ό μ νλ ννλ‘λ§ μ¬μ©ν΄μΌ κ·Έ λ¨μ μ νΌνκ³ μ΄μ λ§ μ·¨ν μ μλ€.
리νλ μ μ μΈμ€ν΄μ€ μμ±μλ§ μ¬μ©νκ³ , λ§λ μΈμ€ν΄μ€λ μΈν°νμ΄μ€λ μμ ν΄λμ€λ‘ μ°Έμ‘°ν΄ μ¬μ©νλΌ.
public static void main(String[] args) {
// ν΄λμ€ μ΄λ¦μ Class κ°μ²΄λ‘ λ³ν
Class<? extends Set<String>> cl = null;
try {
cl = (Class<? extends Set<String>>) // λΉκ²μ¬ νλ³ν, @SuppressWarningsμ μ°κ³ μ£Όμμ λ¬μμΌ νλ€.item27
Class.forName("java.util.HashSet");
} catch (ClassNotFoundException e) {
fatalError("ν΄λμ€λ₯Ό μ°Ύμ μ μμ΅λλ€.");
}
// μμ±μλ₯Ό μ»λλ€.
Constructor<? extends Set<String>> cons = null;
try {
cons = cl.getDeclaredConstructor(); // java.lang.reflect μ¬μ©
} catch (NoSuchMethodException e) {
fatalError("맀κ°λ³μ μλ μμ±μλ₯Ό μ°Ύμ μ μμ΅λλ€.");
}
// μ§ν©μ μΈμ€ν΄μ€λ₯Ό λ§λ λ€.
Set<String> s = null;
try {
s = cons.newInstance(); // java.lang.reflect μ¬μ©
} catch (IllegalAccessException e) {
fatalError("μμ±μμ μ κ·Όν μ μμ΅λλ€.");
} catch (InstantiationException e) {
fatalError("ν΄λμ€λ₯Ό μΈμ€ν΄μ€νν μ μμ΅λλ€.");
} catch (InvocationTargetException e) {
fatalError("μμ±μκ° μμΈλ₯Ό λμ‘μ΅λλ€: " + e.getCause());
} catch (ClassCastException e) {
fatalError("Setμ ꡬννμ§ μμ ν΄λμ€μ
λλ€.");
}
// μμ±ν μ§ν©μ μ¬μ©νλ€. μμ μΈν°νμ΄μ€μΈ Setμ λ©μλλ₯Ό μ¬μ©
s.addAll(Arrays.asList("a","b","c").subList(1, 3));
System.out.println(s);
}
private static void fatalError(String msg) {
System.err.println(msg);
System.exit(1);
}
}
- forName()μ String ννμ ν΄λμ€ νμΌλͺ μ λ£μ΄μ£Όλ©΄ ν΄λΉνλ ν΄λμ€λ₯Ό λ°νν΄μ€λ€. λ¨, μ€μ ν΄λμ€κ° λ§λ€μ΄μ§ κ²μ μλλΌμ λ©λͺ¨λ¦¬μ μ¬λΌμ€μ§ μμλ€.
- newInstance() λ₯Ό μ¬μ©ν΄μ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό λ§λ€μ΄μ€λ€.
- java.io.reflectκ° μ 곡ν΄μ€ μμ±μλ‘ μΈμ€ν΄μ€λ₯Ό μμ±ν μ΄ν λΆν°λ reflectμ κΈ°λ₯μ μ°μ§ μκ³ μΈν°νμ΄μ€λ μμ ν΄λμ€λ₯Ό μ°Έμ‘°ν΄μ μ¬μ©νλ€.
리νλ μ μ λ κ°μ§ λ¨μ
리νλ μ μ μ¬μ©νμ§ μμλ€λ©΄ μ»΄νμΌ νμμ μ‘μ μ μλ μ€λ₯λ€μ 6κ°μ§λ λμ§λ€. ν΄λμ€ μ΄λ¦λ§ μ¬μ©νμ¬ μΈμ€ν΄μ€λ₯Ό μμ±ν΄λ΄κΈ° μν΄ 25μ€μ΄λ λλ μ½λλ₯Ό μμ±νλ€. μμ±μ νΈμΆλ‘λ νμ€μ΄λ©΄ λλ€.
μ½λλ₯Ό μ€μ΄κΈ° μν΄ java.io.reflectμ μ΅μμ μ€λ₯μΈ ReflectiveOperationException μ μ¬μ©ν΄λ λλ€.
ReflectiveOperationExceptionμ subclass exception
리νλ μ μ λ°νμμ μ‘΄μ¬νμ§ μμ μλ μλ λ€λ₯Έ ν΄λμ€, λ©μλ, νλμμ μμ‘΄μ±μ κ΄λ¦¬ν λ μ ν©νλ€.
- λ²μ Όμ΄ μ¬λ¬ κ° μ‘΄μ¬νλ μΈλΆ ν¨ν€μ§λ₯Ό λ€λ£° λ μ μ©νλ€.
- κ°μ₯ μ€λλ λ²μ Όλ§ μ§μνλλ‘ μ»΄νμΌ ν ν, μ΄ν λ²μ Όμ ν΄λμ€μ λ©μλλ 리νλ μ μΌλ‘ μ κ·Όνλ λ°©μμ΄λ€.
- μ΄λ° κ²½μ° μ κ·Όνλ €λ μλ‘μ΄ ν΄λμ€λ λ©μλκ° λ°νμμ μ‘΄μ¬νμ§ μμ μ μλ€λ μ¬μ€μ κ°μν΄μ λ체 μλ¨μ λ§λ€μ΄ λ¬μΌνλ€.
ν΅μ¬μ 리
리νλ μ
μ 볡μ‘ν μμ€ν
μ κ°λ°ν λ νμν κ°λ ₯ν κΈ°λ₯μ΄μ§λ§ λ¨μ μ΄ λ§κΈ° λλ¬Έμ 리νλ μ
μ λλλ‘ κ°μ²΄ μμ±μλ§ μ¬μ©νκ³ ,
μμ±ν κ°μ²΄λ₯Ό μ΄μ©ν λλ μ μ ν μΈν°νμ΄μ€λ μ»΄νμΌ νμμ μ μ μλ μμ ν΄λμ€λ‘ νλ³νν΄μ μ¬μ©ν΄μΌ νλ€.