代码之家  ›  专栏  ›  技术社区  ›  shurrok

使用反射和类名通过companion获取单例对象

  •  0
  • shurrok  · 技术社区  · 5 年前

    正如标题所示,我希望通过使用类名的反射获得一个单例实例。假设我有一门课:

    abstract class MyRoomDatabase : RoomDatabase() { 
    
        abstract fun exampleEntityDao() : ExampleEntityDao
    
        companion object { 
    
            @Volatile
            private var INSTANCE: MyClass? = null
            fun getDatabase(context: Context): MyClass {
                return INSTANCE ?: synchronized(this) {
                    val instance = Room.databaseBuilder(context.applicationContext, MyRoomDatabase::class.java, "db").build()
    
                    INSTANCE = instance
                    instance
                }
            }
        }
    }
    

    现在,知道类名了吗 val strClass = MyRoomDatabase::class.qualifiedName.toString()

    我希望实现: MyRoomDatabase.getDatabase(this).getExampleEntityDao().doSomeStuff()

    我试过这个:

    val strClass = MyRoomDatabase::class.qualifiedName.toString()
    val classFromStr = Class.forName(strClass)
    val companion = classFromStr::class.companionObject
    

    那么,, companion 是空的。

    val companion = MyRoomDatabase::class.companionObject 给我一个实际的伴奏,但我不能这样做,因为在应该这样做的地方,编译器只知道类名。

    0 回复  |  直到 5 年前
        1
  •  0
  •   Alexey Romanov    4 年前

    classFromStr::class 将返回 classFromStr 那是 Class 没有伴星。

    val companion = classFromStr.kotlin.companionObject