본문 바로가기

Java/Java 기초

Java Reflection 사용하기 (1)

이 문서는 Oracle Technology Network에 포스팅되었던 Using Java Reflection을 참고하여 작성되었습니다. 원문은 아래의 링크에서 확인하실 수 있습니다.


Using Java Reflection

https://www.oracle.com/technetwork/articles/java/javareflection-1536171.html


Reflection은 Java 언어의 특징적인 기능이라고 할 수 있습니다. Reflection을 이용하면 작성된 Java 프로그램에 대한 검사가 가능해지며, 프로그램에 대한 자체적인 검사도 가능해집니다. 예를 들어 Java class를 구성하고 있는 모든 member에 대한 확인이 가능해집니다.


Java class에 직접적인 접근으로 프로그램을 검사하고, 조작하는 것이 그다지 긍정적으로 보이지는 않을 수 있습니다. 하지만 이는 다른 프로그밍 언어에서는 존재하지 않는 Java의 독특한 기능이라고 할 수 있습니다. 예를 들어 Pascal, C, C++ 등의 언어로 작성된 프로그램에서 정의된 함수에 대한 정보를 얻을 수 있는 방법은 존재하지 않습니다.


JavaBean에서 Reflection을 명시적으로 사용하는 방법 중 하나는 builder tool을 통하여 시각적으로 프로그램 구성요소를 조작하는 것입니다. builder tool은 동적으로 로드되는 Java 프로그램의 구성요소를 가져올 수 있습니다.


간단한 예시

Reflection이 어떻게 작동하지를 확인하기 위해 아래의 예시를 살펴보겠습니다.


import java.lang.reflect.*;

public class DumpMethods {
    public static void main(String args[]) {
        try {
            Class c = Class.forName(args[0]);
            Method m[] = c.getDeclaredMethods();
            for (int i = 0; i < m.length; i++)
                System.out.println(m[i].toString());
        } catch (Throwable e) {
            System.err.println(e);
        }
    }
}


위 프로그램을 실행시에 java.util.Stack이라는 Stack class 정보를 입력하는 경우 Stack class에 정의된 함수들 정보를 아래와 같이 확인할 수 있습니다.


  public java.lang.Object java.util.Stack.push(
    java.lang.Object)
   public synchronized 
     java.lang.Object java.util.Stack.pop()
   public synchronized
      java.lang.Object java.util.Stack.peek()
   public boolean java.util.Stack.empty()
   public synchronized 
     int java.util.Stack.search(java.lang.Object)

   -----


java.util.Stack class의 함수 이름을 확인할수 있으며, 매개변수와 리턴 타입도 함께 확인할 수 있습니다.


이 프로그램에서는 class를 class.forName을 이용하여 로드하였으며, getDeclaredMethod를 사용하여 class에 정의된 함수를 탐색하였습니다. 

'Java > Java 기초' 카테고리의 다른 글

Java Reflection 사용하기 (3)  (0) 2019.02.13
Java Reflection 사용하기 (2)  (0) 2019.02.12
Autoboxing과 AutoUnboxing  (0) 2019.01.14
Properties Class 사용  (0) 2018.06.12
SHA256 encoding  (0) 2018.05.31