๋ฆฌํ๋ ์
์ด๋ ๊ตฌ์ฒด์ ์ธ ํด๋์ค ํ์
์ ์์ง ๋ชปํ๋๋ผ๋ ๊ทธ ํด๋์ค์ ๋ฉ์๋, ํ์
, ๋ณ์๋ค์ ์ ๊ทผํ ์ ์๋๋ก ํด์ฃผ๋ ์๋ฐ API์
๋๋ค.
์ปดํ์ผ ์๊ฐ์ด ์๋ ์คํ ์๊ฐ์ ๋์ ์ผ๋ก ํน์ ํด๋์ค์ ์ ๋ณด๋ฅผ ์ถ์ถํ ์ ์๋ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ์
๋๋ค.
๋ฆฌํ๋ ์
์ ์ฌ์ฉํ์ฌ ๊ฐ์ ธ์ฌ ์ ์๋ ์ ๋ณด๋ Class
, Constructor
, Method
, Field
๊ฐ ์์ต๋๋ค.
๋ฆฌํ๋ ์
์ ๋์ ์ผ๋ก ํด๋์ค๋ฅผ ์ฌ์ฉํด์ผ ํ ๊ฒฝ์ฐ, ์ฆ ์์ฑ ์์ ์๋ ์ด๋ค ํด๋์ค๋ฅผ ์ฌ์ฉํ ์ง ๋ชจ๋ฅด์ง๋ง ๋ฐํ์ ์์ ์์ ๊ฐ์ ธ์ ์คํํ๋ ๊ฒฝ์ฐ ํ์ํฉ๋๋ค.
ํ๋ ์์ํฌ๋ IDE์์ Spring Annotation, IntelliJ ์๋ ์์ฑ ๊ธฐ๋ฅ ๋ฑ์ ์ด๋ฐ ๋์ ๋ฐ์ธ๋ฉ์ ์ด์ฉํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
Class.forName("ํด๋์ค์ด๋ฆ")
์ ํตํด ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๊ณ ํด๋์ค์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
public class DoHee {
public String name;
public int number;
public void setDoHee (String name, int number) {
this.name = name;
this.number = number;
}
public void setNumber(int number) {
this.number = number;
}
public void sayHello(String name) {
System.out.println("Hello, " + name);
}
}
import java.lang.reflect.Method;
import java.lang.reflect.Field;
public class ReflectionTest {
public void reflectionTest() {
try {
Class myClass = Class.forName("DoHee");
Method[] methods = myClass.getDeclaredMethods();
/* ํด๋์ค ๋ด ์ ์ธ๋ ๋ฉ์๋์ ๋ชฉ๋ก ์ถ๋ ฅ */
/* ์ถ๋ ฅ : public void DoHee.setDoHee(java.lang.String,int)
public void DoHee.setNumber(int)
public void DoHee.sayHello(java.lang.String) */
for (Method method : methods) {
System.out.println(method.toString());
}
/* ๋ฉ์๋์ ๋งค๊ฐ๋ณ์์ ๋ฐํ ํ์
ํ์ธ */
/* ์ถ๋ ฅ : Class Name : class DoHee
Method Name : setDoHee
Return Type : void */
Method method = methods[0];
System.out.println("Class Name : " + method.getDeclaringClass());
System.out.println("Method Name : " + method.getName());
System.out.println("Return Type : " + method.getReturnType());
/* ์ถ๋ ฅ : Param Type : class java.lang.String
Param Type : int */
Class[] paramTypes = method.getParameterTypes();
for(Class paramType : paramTypes) {
System.out.println("Param Type : " + paramType);
}
/* ๋ฉ์๋ ์ด๋ฆ์ผ๋ก ํธ์ถ */
Method sayHelloMethod = myClass.getMethod("sayHello", String.class);
sayHelloMethod.invoke(myClass.newInstance(), new String("DoHee")); // ์ถ๋ ฅ : Hello, DoHee
/* ๋ค๋ฅธ ํด๋์ค์ ๋ฉค๋ฒ ํ๋์ ๊ฐ ์์ */
Field field = myClass.getField("number");
DoHee obj = (DoHee) myClass.newInstance();
obj.setNumber(5);
System.out.println("Before Number : " + field.get(obj)); // ์ถ๋ ฅ : Before Number : 5
field.set(obj, 10);
System.out.println("After Number : " + field.get(obj)); // ์ถ๋ ฅ : After Number : 10
} catch (Exception e) {
// Exception Handling
}
}
public static void main(String[] args) {
new ReflectionTest().reflectionTest();
}
}