记录下如何使用kotlin反射获取实例。
随笔一下:本人还没入门kotlin,但是无奈客户提供一个sdk是kotlin写的,需要做sdk内部的实现。这些都可以用java代替,但是客户用到了koin,这个好像只能用kotlin写,看了koin的代码, 不是很懂用java怎么new一个single对象,如果知道的,可以交流一下。
但是用kotlin是真的很方便啊,直接 single<ClassName> { obj }就好了,太方便了。
扯远了,这里补充一下我需要反射这个类,获取到相关module的方法
刚开始发现kotlin编译出来也是class文件,我想当然的以为就像java那样反射就可以了。
public List<Module> getPlatformModules() {
try {
Class<?> clazz = Class.forName(IMPL);
return ((PlatformModules) clazz.newInstance()).getPlatformModules();
} catch (Exception var1) {
Log.w("getPlatformModules", "PlatformModules not found");
return null;
}
}
没想到空指针了。
原来kotlin文件在编译之后,不是class,是KClass文件。
我没有找到用java反射kotlin的方式。
所有就新建了一个kotlin文件做了。
还是这段代码,使用kotlin方式反射 这样就可以啦。
private fun getPlatformModules(): List<Module> {
val clazz = Class.forName(IMPL).kotlin
val obj: PlatformModules = clazz.objectInstance as PlatformModules
return obj.getPlatformModules()
}
ps:kotlin反射需要依赖反射的包
需要在app的module的build.gradle 中添加依赖
dependencies {
implementation "org.jetbrains.kotlin:kotlin-reflect:1.4.32"
}