자바 리플렉션이란 컴파일 된 자바 코드에서 역으로 클래스를 불러서 메소드 및 변수를 구해오는 방법으로 클래스를 동적으로 로딩하여 사용
public class MyClass {
// ...
}
일반적인 클래스 사용
MyClass myClass = new MyClass("mike");
String myName = myClass.getMyName();
이런 식으로 사용이 되는데, 보통 자바 문법은 S(주어: object) V(동사: method) O(목적어: argument) 순서 이지만 리플렉션은 V.invoke(S,O) 순이다.
이를 리플렉션으로 풀어보면 아래처럼 된다.
Class myClass = Class.forName("MyClass");
Constructor myConstructor = myClass.getConstructor(new Class[] {String.class});
Object myObj = myConstructor.newInstance("mike");
Method method = myClass.getMethod("getMyName");
String myName = (String)method.invoke(myObj);
메소드의 인자가 여러 개인 경우라면 거기에 맞추어야 한다.
Class[] intParamClass = new Class[] {int.class, int.class};
Object[] intParamObject = new Object[] {1, 2};
Method method3 = myClass.getMethod("mySum", intParamClass);
int sum = (int)method3.invoke(myObj, intParamObject);
함수 호출 외에도 변수(필드)를 다룰 때도 조금 다르다. set과 get을 이용한다. private 필드에 접근하려 할 때는 setAccessible(true)가 필요하며, getDeclaredField가 사용된다.