1 package expo.modules.devmenu
2 
3 import com.facebook.react.ReactPackage
4 import com.facebook.react.bridge.JSIModulePackage
5 
6 const val DEV_MENU_TAG = "ExpoDevMenu"
7 
getVendoredPackagenull8 fun getVendoredPackage(className: String): ReactPackage {
9   return getVendoredClass(className, emptyArray(), emptyArray())
10 }
11 
getVendoredJNIPackagenull12 fun getVendoredJNIPackage(className: String): JSIModulePackage {
13   return getVendoredClass(className, emptyArray(), emptyArray())
14 }
15 
getVendoredClassnull16 fun <T> getVendoredClass(className: String, argsType: Array<Class<*>>, args: Array<Any>): T {
17   val clazz = try {
18     Class.forName("devmenu.$className")
19   } catch (e: ClassNotFoundException) {
20     Class.forName(className)
21   }
22 
23   return constructFromClass(clazz, argsType, args)
24 }
25 
26 @Suppress("UNCHECKED_CAST")
constructFromClassnull27 fun <T> constructFromClass(clazz: Class<*>, argsType: Array<Class<*>>, args: Array<Any>): T {
28   val constructor = clazz.getConstructor(*argsType)
29   return constructor.newInstance(*args) as T
30 }
31 
setPrivateFieldnull32 fun setPrivateField(obj: Any, objClass: Class<*>, field: String, newValue: Any) =
33   objClass.getDeclaredField(field).run {
34     isAccessible = true
35     set(obj, newValue)
36   }
37 
getPrivateFilednull38 inline fun <reified T> getPrivateFiled(obj: Any, objClass: Class<*>, field: String) =
39   objClass.getDeclaredField(field).run {
40     isAccessible = true
41     get(obj) as T
42   }
43