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