ABOUT ME

IT 블로그

Today
Yesterday
Total
  • Reflection 리플렉션
    Java/기본 2018. 1. 21. 23:46
    728x90
    반응형

    토비의 스프링 3.1 Vol.1 6장을 읽다가 리플렉션에 대해 설명이 나왔는데 쉽게 잘 설명이 되있다. 그래서 책의 내용을 읽고 정리해보았다.


    위키에 리플렉션에 대한 정의는 다음과 같다.

    반영(Reflection)은 컴퓨터 프로그램에서 런타임 시점에 사용되는 자신의 구조와 행위를 관리(type introspection)하고 수정할 수 있는 프로세스를 의미한다. “type introspection”은 객체 지향 프로그램언어에서 런타임에 객체의 형(type)을 결정할 수 있는 능력을 의미한다.

    위의 설명만으로는 잘 와닿지 않는다. 아래는 책의 설명이다.


    자바의 모든 클래스는 그 클래스 자체의 구성정보를 담은 Class 타입의 오브젝트를 하나씩 갖고 있다. '클래스이름'.class'라고 하거나 오브젝트의 getClass() 메소드를 호출하면 클래스 정보를 담은 Class 타입의 오브젝트를 가져올 수 있다.


    이렇게 가져온 Class 타입의 오브젝트를 가지고 할 수 있는 것

    클래스의 이름이 무엇이고, 어떤 클래스를 상속하고, 어떤 인터페이스를 구현했는지, 어떤 필드를 갖고 있고, 각각의 타입은 무엇인지, 메소드를 어떤 것을 정의했고, 메소드의 파라미터와 리턴 타입은 무엇인지 알아낼 수 있다. 더 나아가서 오브젝트 필들의 값을 읽고 수정할 수도 있고, 원하는 파라미터 값을 이용해 메소드를 호출할 수도 있다.


    참 많은 것을 할 수 있는것 같다. 구체적인 내용은 다른 곳에 잘 나와있으니 책에 나오는 코드만 적도록 하겠다. 간단하게 특정 Class의 메소드를 실행시키는 방법은 알 수 있을 것이다. 책에는 String객체의 length, charAt메소드만 나오는데, argument가 2개인 substring메소드에 대한 테스트도 추가했다.

    import org.junit.Test;
    import java.lang.reflect.Method;
    import static org.hamcrest.core.Is.is;
    import static org.junit.Assert.assertThat;
    public class ReflectionTest {
    @Test
    public void invokeMethod() throws Exception {
    String name = "Spring";
    // length()
    assertThat(name.length(), is(6)); // 기본 length()메소드를 이용해서 "Spring"의 길이가 6인 것을 확인한다.
    Method lengthMethod = String.class.getMethod("length"); // String클래스의 메소드명을 argument로 넣어서 getMethod를 호출한다.
    assertThat(lengthMethod.invoke(name), is(6)); // 실행시키고자하는 함수(타깃)을 argument로 넣어서 invoke메소드를 호출한다.
    // charAt()
    assertThat(name.charAt(0), is('S'));
    Method charAtMethod = String.class.getMethod("charAt", int.class); // invoke를 실행시킬 때 필요한 argument를 getMethod의 argument로 넣어준다.
    assertThat(charAtMethod.invoke(name, 0), is('S'));
    // split()
    assertThat(name.substring(1, 3), is("pr"));
    Method substringMethod = String.class.getMethod("substring", int.class, int.class); // invoke할 때 argument가 2개 필요하니 getMethod의 2,3번째에 argument로 넣어준다.
    assertThat(substringMethod.invoke(name, 1, 3), is("pr"));
    }
    }


    출처

    • 위키피디아: 반영
    • 토비의 스프링 3.1 6장_AOP p.437 ~ 438


    반응형

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

    댓글

Designed by Tistory.