본문 바로가기

Kotlin

Reflection #1

런 타임에 실행 중인 어플리케이션의 정보를 JVM으로부터 참조하거나 수정하는 기술

  • 클래스, 인터페이스, 메소드, 필드 등을 찾을 수 있다.
  • 객체를 생성하거나 변수를 변경, 메소드 호출이 가능하다.
  • 자바에서 기본적으로 제공하는 API

 

Sample

String 클래스의 이름을 통해 String 클래스가 가진 모든 메서드 이름을 출력한다.

@Test
fun `스트링 클래스에 존재하는 모든 메소드`() {

    val c = Class.forName("java.lang.String")
    val m = c.declaredMethods

    m.forEach {
        println(it.name)
    }
}

 

  • Class 인스턴스의 getDeclaredMethods() 메소드를 호출하면 Method 배열을 얻을 수 있다.
  • Method는 java.lang.reflect 패키지에 있는 클래스 중 하나로 단일 메서드에 대한 정보 및 접근을 할 수 있도록 해 준다.
  • Method.getName()는 메소드의 이름을 반환한다.

 

3가지 스텝

1. Class 객체를 얻는다. (java.lang.Class 객체를 얻는다)

 

@Test
fun `클래스 객체를 얻는다`() {
    val c1 = Class.forName("java.lang.String")
    val c2 = Int::class.java
    val c3 = Integer.TYPE
}

 

2. getDeclaredMethods()와 같은 메소드를 호출 한다.

  • getDeclaredConstructors() - 클래스에 선언된 생성자들을 배열로 반환한다.
  • getDeclaredMethods() - 클래스에 선언된 메소드들을 배열로 반환한다.
  • getDeclaredFields() - 클래스에 선언된 필드들을 배열로 반환한다.
  • 공식 문서 - https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html

3. Reflection API를 사용하여 정보를 조작 한다.

 

@Test
fun `String Class의 첫번째 메소드 이름을 출력한다`() {
    val c = Class.forName("java.lang.String")
    val m = c.declaredMethods
    println(m[0].name)
}

 

instanceof 연산자 실험

@Test
fun `instanceOf 연산자 실험`() {
    val c = Class.forName("java.lang.String")
    val b1 = c.isInstance(3)
    assertTrue(b1) // 실패
    val b2 = c.isInstance("Test")
    assertTrue(b2) // 성공
}

 

클래스의 메소드 정보 찾기

    @Test
    fun `클래스의 메소드 찾기`() {
        val clazz = Class.forName("java.lang.String")
        val methods = clazz.declaredMethods

        methods.forEach { method ->
            println("메소드 이름 = ${method.name}")
            println("정의된 클래스 이름 = ${method.declaringClass}")

            val pvec = method.parameterTypes
            pvec.forEachIndexed { index, param ->
                println("인자 $index = $param")
            }

            val evec = method.exceptionTypes
            evec.forEachIndexed { index, exception ->
                println("익셉션 $index = $exception")
            }

            println("return type = ${method.returnType}")
        }
    }

 

 

 

 

출처

- 도서, 아키텍처를 알아야 앱 개발이 보인다

- 블로그, 찰스의 안드로이드 https://www.charlezz.com/?p=756

 

안드로이드와 Java의 Reflection | 찰스의 안드로이드

Reflection이란? Reflection은 자바 언어의 기능중 하나로 프로그램 내부 속성을 조작 할 수 있게 합니다. 예를 들어 Java클래스가 가지고 있는 모든 멤버의 이름을 가져와서 표시 할 수 있습니다. 다른

www.charlezz.com

 

'Kotlin' 카테고리의 다른 글

Reflection #2  (0) 2020.07.01