본문 바로가기

Java/Java 기초

Java Reflection 사용하기 (6)

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


Using Java Reflection

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


새로운 객체 생성하기

생성자를 호출하는 것은 새로운 객체를 생성한다는 측면에서 단순한 함수 호출과는 다르다고 할 수 있습니다. (정확히는 새 객체를 만든다는 것은 메모리 할당과 객체의 생성을 포함하는 것입니다.) 그렇기 때문에 앞의 함수 호출의 예와 최대한 유사한 예시를 찾아보면 아래와 같습니다.


import java.lang.reflect.*;

public class constructor2 {
    public constructor2() {
    }

    public constructor2(int a, int b) {
        System.out.println("a = " + a + " b = " + b);
    }

    public static void main(String args[]) {
        try {
            Class cls = Class.forName("constructor2");
            Class partypes[] = new Class[2];
            partypes[0] = Integer.TYPE;
            partypes[1] = Integer.TYPE;
            
            Constructor ct = cls.getConstructor(partypes);
            Object arglist[] = new Object[2];
            arglist[0] = new Integer(37);
            arglist[1] = new Integer(47);
            
            Object retobj = ct.newInstance(arglist);
        } catch (Throwable e) {
            System.err.println(e);
        }
    }
}


지정된 매개변수 타입을 다루고 호출하여 새로운 인스턴스를 생성해주는 생성자를 찾아줍니다. 이러한 접근이 가치있는 것은 생성자의 조회와 호출이 컴파일 시점이 아니라 실행 시점에 발생하는 순수한 동적처리이기 때문입니다.


필드 값의 변경

reflection의 또다른 사용법은 객체 안의 필드 값을 변경하는 것입니다. 실행되는 프로그램에서 필드명을 이용하여 필드를 찾아내고 값을 변경하는 등 앞서 말한 reflection의 동적인 특성을 잘 이용하여 적용된 기능입니다. 다음 예시를 보겠습니다.



import java.lang.reflect.*;

public class field2 {
    public double d;

    public static void main(String args[]) {
        try {
            Class cls = Class.forName("field2");
            Field fld = cls.getField("d");
            
            field2 f2obj = new field2();
            System.out.println("d = " + f2obj.d);
            
            fld.setDouble(f2obj, 12.34);
            System.out.println("d = " + f2obj.d);
        } catch (Throwable e) {
            System.err.println(e);
        }
    }
}


예시에서 처리한 대로 d의 값은 12.34가 됩니다.

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

ParallelStream의 결과를 List에 저장  (1) 2019.11.08
Java Reflection 사용하기 (7)  (0) 2019.02.18
Java Reflection 사용하기 (5)  (0) 2019.02.15
Java Reflection 사용하기 (4)  (0) 2019.02.15
Java Reflection 사용하기 (3)  (0) 2019.02.13