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 
getFieldInClassHierarchynull7 fun <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>null20 fun <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 
getProtectedFieldValuenull39 fun <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