본문 바로가기

Java/Java 기초

Java Reflection 사용하기 (2)

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


Using Java Reflection

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


Reflection을 사용하기 위한 세팅

앞서 사용한 Method와 같은 reflection class는 java.lang.reflect 패키지에 포함되어 있다. reflect class 들을 사용하기 위해서는 세 단계를 거쳐야한다.


첫번째 단계는 조작하고자 하는 java.lang.Class 객체를 가져오는 것입니다. java.lang.Class는 Java 프로그램 내에서 class와 interface를 나타내기 위해 사용됩니다.


Class 객체를 가져오기 위한 방법중 한가지는 아래와 같이 표현하는 것입니다.


Class c = Class.forName("java.lang.String");


String class 객체를 가져오게 됩니다.


다른 방법으로는 


Class c = int.class;

혹은

Class c = Integer.TYPE;


와 같은 방식이 있는데 위 두 방식 모두 fundamental 타입의 class 정보를 가져오기 위한 것입니다. .TYPE으로 표시한 방식은 미리 wrapper에서 fundamental 타입으로 정의된 필드에 접근하여 정보를 가져오는 것입니다.


두번째 단계로는 getDeclaredMethods 함수를 호출하여 class에 정의된 함수 리스트를 가져오는 것입니다.


정보를 가져온 뒤 마지막으로 reflection API를 사용하여 정보를 조작하는 것입니다.


예를 들면 아래와 같은형태로 구현되는 것을 볼 수 있습니다.


Class c = Class.forName("java.lang.String");
Method m[] = c.getDeclaredMethods();
System.out.println(m[0].toString());


이 코드를 통해 String에서 정의된 첫번째 함수가 어떻게 표현되고 있는지 확인할 수 있습니다. 



instanceof Operator 시뮬레이션해보기

Class 정보를 이용하여 Class 객체에 대한 추가적인 기능을 구현해볼 수 있습니다. 예를 들면 Class.isInstance 함수를 이용하여 instanceof operator를 구현해보는 것입니다.


class A {
}

public class instance1 {
    public static void main(String args[]) {
        try {
            Class cls = Class.forName("A");
            boolean b1 = cls.isInstance(new Integer(37));
            System.out.println(b1);
            boolean b2 = cls.isInstance(new A());
            System.out.println(b2);
        } catch (Throwable e) {
            System.err.println(e);
        }
    }
}


위 코드에서 A Class 객체가 생성되었을 때, 각각 Integer나 A의 class 인스턴스인지 isInstance 함수를 이용하여 확인할 수 있습니다. 


Integer(37)은 A class 인스턴스가 아니므로 false가 출력되며, new A()로 생성된 인스턴스는 A Class 인스턴스이므로 true가 출력됩니다.

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

Java Reflection 사용하기 (4)  (0) 2019.02.15
Java Reflection 사용하기 (3)  (0) 2019.02.13
Java Reflection 사용하기 (1)  (0) 2019.02.12
Autoboxing과 AutoUnboxing  (0) 2019.01.14
Properties Class 사용  (0) 2018.06.12