런 타임에 실행 중인 어플리케이션의 정보를 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 |
---|