1 package expo.modules.devlauncher.helpers 2 3 import java.lang.Exception 4 import java.lang.reflect.Field 5 import java.lang.reflect.Modifier 6 getFieldInClassHierarchynull7fun <T> Class<T>.getFieldInClassHierarchy(fieldName: String): Field? { 8 var currentClass: Class<*>? = this 9 var result: Field? = null 10 while (currentClass != null && result == null) { 11 try { 12 result = currentClass.getDeclaredField(fieldName) 13 } catch (e: Exception) { 14 } 15 currentClass = currentClass.superclass 16 } 17 return result 18 } 19 <lambda>null20fun <T> Class<out T>.setProtectedDeclaredField(obj: T, filedName: String, newValue: Any, predicate: (Any?) -> Boolean = { true }) { 21 val field = getDeclaredField(filedName) 22 val modifiersField = Field::class.java.getDeclaredField("accessFlags") 23 24 field.isAccessible = true 25 modifiersField.isAccessible = true 26 27 modifiersField.setInt( 28 field, 29 field.modifiers and Modifier.FINAL.inv() 30 ) 31 32 if (!predicate.invoke(field.get(obj))) { 33 return 34 } 35 36 field.set(obj, newValue) 37 } 38 getProtectedFieldValuenull39fun <T, U> Class<out T>.getProtectedFieldValue(obj: T, filedName: String): U { 40 val field = getDeclaredField(filedName) 41 field.isAccessible = true 42 43 @Suppress("UNCHECKED_CAST") 44 return field.get(obj) as U 45 } 46