자바 리플렉션이란 컴파일 된 자바 코드에서 역으로 클래스를 불러서 메소드 및 변수를 구해오는 방법으로 클래스를 동적으로 로딩하여 사용

1. 리플렉션 기본

public class MyClass {
	// ...
}

일반적인 클래스 사용

MyClass myClass = new MyClass("mike");
String myName = myClass.getMyName();

이런 식으로 사용이 되는데, 보통 자바 문법은 S(주어: object) V(동사: method) O(목적어: argument) 순서 이지만 리플렉션은 V.invoke(S,O) 순이다.

  1. 먼저 클래스를 불러오고
  2. 생성자를 구하고 생성자에 인자를 넘겨 생성자를 만들고 인스턴스를 만든다.
  3. 메소드를 얻어와서 invoke() 함수로 실행

이를 리플렉션으로 풀어보면 아래처럼 된다.

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);

2. 메소드 및 인자값 전달하기

메소드의 인자가 여러 개인 경우라면 거기에 맞추어야 한다.

  1. 인자의 타입을 Class배열로 만들어 둔다.
  2. 인자값을 Object배열로 만든다.
  3. 인자 타입(intParamClass)을 전달하며 클래스로 부터 메소드를 얻는다.
  4. 얻어진 메소드에 클래스와 인자값(intParamObject)을 넘겨 실행한다.
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);

3. 필드 다루기

함수 호출 외에도 변수(필드)를 다룰 때도 조금 다르다. setget을 이용한다. private 필드에 접근하려 할 때는 setAccessible(true)가 필요하며, getDeclaredField가 사용된다.