본문 바로가기

Java/Java 기초

Java Reflection 사용하기 (3)

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


Using Java Reflection

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


Class에서 정의된 함수 확인

reflection을 사용하는 여러 방법들 중에서도 가장 기본적인 기능은 class에서 정의한 함수들을 확인할 수 있다는 것입니다. 구체적인 구현 내용은 아래와 같습니다.


import java.lang.reflect.*;

public class method1 {
    private int f1(Object p, int x) throws NullPointerException {
        if (p == null)
            throw new NullPointerException();
        return x;
    }

    public static void main(String args[]) {
        try {
            Class cls = Class.forName("method1");
            
            Method methlist[] = cls.getDeclaredMethods();
            for (int i = 0; i < methlist.length; i++) {
                Method m = methlist[i];
                
                System.out.println("name = " + m.getName());
                System.out.println("decl class = " + m.getDeclaringClass());
                
                Class pvec[] = m.getParameterTypes();
                for (int j = 0; j < pvec.length; j++)
                    System.out.println("param #" + j + " " + pvec[j]);
                
                Class evec[] = m.getExceptionTypes();
                for (int j = 0; j < evec.length; j++)
                    System.out.println("exc #" + j + " " + evec[j]);
                
                System.out.println("return type = " + m.getReturnType());
                System.out.println("-----");
            }
        } catch (Throwable e) {
            System.err.println(e);
        }
    }
}


프로그램에서 method1 Class 정보를 가져온 후, getDeclaredMethods 함수를 호출하여 Method 객체 리스트를 가져오게 되는데 리스트에 담겨있는 객체 하나하나에 method가 정의되어 있습니다. 리스트에는 접근 제한자와 상관없이 모든 함수들이 담겨있게 됩니다. getDeclaredMethods를 사용하는 대신 getMethods를 사용할 수 있는데, getMethods를 사용하면 단순히 class내에 선언된 함수들뿐만 아니라 상속하고 있는 Class에서 정의된 함수 정보도 가져올 수 있습니다.


Method 객체 리스트를 가져온 후에는 함수에서 사용하고 있는 매개변수 타입, Exception 타입, return 타입 등을 각 함수별로 확인할 수 있습니다.

각 타입이 기본 타입인지 아니면 Class인지 상관없이 순차적으로 정보를 확인할 수 있는 것입니다.


아래는 프로그램 출력 내용입니다.


name = f1
   decl class = class method1
   param #0 class java.lang.Object
   param #1 int
   exc #0 class java.lang.NullPointerException
   return type = int
   -----
   name = main
   decl class = class method1
   param #0 class [Ljava.lang.String;
   return type = void 

   -----


생성자 정보 가져오기

함수 정보를 가져오는 방법과 유사한 방식으로 class의 생성자도 가져올 수 있습니다.


import java.lang.reflect.*;

public class constructor1 {
    public constructor1() {
    }

    protected constructor1(int i, double d) {
    }

    public static void main(String args[]) {
        try {
            Class cls = Class.forName("constructor1");
            Constructor ctorlist[] = cls.getDeclaredConstructors();
            
            for (int i = 0; i < ctorlist.length; i++) {
                Constructor ct = ctorlist[i];
                System.out.println("name = " + ct.getName());
                System.out.println("decl class = " + ct.getDeclaringClass());
                Class pvec[] = ct.getParameterTypes();
                
                for (int j = 0; j < pvec.length; j++)
                    System.out.println("param #" + j + " " + pvec[j]);
                
                Class evec[] = ct.getExceptionTypes();
                for (int j = 0; j < evec.length; j++)
                    System.out.println("exc #" + j + " " + evec[j]);
                
                System.out.println("-----");
            }
        } catch (Throwable e) {
            System.err.println(e);
        }
    }
}


생성자는 return 타입이 존재하지 않기 때문에 위 프로그램이 동작하더라도 return type과 관련된 정보는 확인할 수 없습니다.

출력 결과는 아래와 같습니다.


   name = constructor1
   decl class = class constructor1
   -----
   name = constructor1
   decl class = class constructor1
   param #0 int
   param #1 double
   -----


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

Java Reflection 사용하기 (5)  (0) 2019.02.15
Java Reflection 사용하기 (4)  (0) 2019.02.15
Java Reflection 사용하기 (2)  (0) 2019.02.12
Java Reflection 사용하기 (1)  (0) 2019.02.12
Autoboxing과 AutoUnboxing  (0) 2019.01.14