-
Reflection 리플렉션Java/기본 2018. 1. 21. 23:46728x90반응형
토비의 스프링 3.1 Vol.1 6장을 읽다가 리플렉션에 대해 설명이 나왔는데 쉽게 잘 설명이 되있다. 그래서 책의 내용을 읽고 정리해보았다.
위키에 리플렉션에 대한 정의는 다음과 같다.
반영(Reflection)은 컴퓨터 프로그램에서 런타임 시점에 사용되는 자신의 구조와 행위를 관리(type introspection)하고 수정할 수 있는 프로세스를 의미한다. “type introspection”은 객체 지향 프로그램언어에서 런타임에 객체의 형(type)을 결정할 수 있는 능력을 의미한다.
위의 설명만으로는 잘 와닿지 않는다. 아래는 책의 설명이다.
자바의 모든 클래스는 그 클래스 자체의 구성정보를 담은 Class 타입의 오브젝트를 하나씩 갖고 있다. '클래스이름'.class'라고 하거나 오브젝트의 getClass() 메소드를 호출하면 클래스 정보를 담은 Class 타입의 오브젝트를 가져올 수 있다.
이렇게 가져온 Class 타입의 오브젝트를 가지고 할 수 있는 것
클래스의 이름이 무엇이고, 어떤 클래스를 상속하고, 어떤 인터페이스를 구현했는지, 어떤 필드를 갖고 있고, 각각의 타입은 무엇인지, 메소드를 어떤 것을 정의했고, 메소드의 파라미터와 리턴 타입은 무엇인지 알아낼 수 있다. 더 나아가서 오브젝트 필들의 값을 읽고 수정할 수도 있고, 원하는 파라미터 값을 이용해 메소드를 호출할 수도 있다.
참 많은 것을 할 수 있는것 같다. 구체적인 내용은 다른 곳에 잘 나와있으니 책에 나오는 코드만 적도록 하겠다. 간단하게 특정 Class의 메소드를 실행시키는 방법은 알 수 있을 것이다. 책에는 String객체의 length, charAt메소드만 나오는데, argument가 2개인 substring메소드에 대한 테스트도 추가했다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersimport 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 > 기본' 카테고리의 다른 글
[Java9] Variable Handles (1) 2018.05.02 [Java9] try-with-resources Improvement (0) 2018.04.28 [Java9] 자바9 설치 (1) 2017.09.23 [Java7] 자바 숫자 _(언더바) 표현 (2) 2017.07.09 [Java7] readAllLines (0) 2017.02.09