在把java文件转换成konlit文件时碰到的坑,记录一下。
Java code:
Method forName = Class.class.getDeclaredMethod("forName", String.class);
Method getDeclaredMethod = Class.class.getDeclaredMethod("getDeclaredMethod", String.class, Class[].class);
Kotlin code:
转换当然用Android studio比较方便了,当然转的质量没保证,基本上都需要手动再修改的:
Android Studio -> Code -> Convert Java File to Kotlin File ->
转换后得到的错误结果如下:
val forName = Class<*>::class.java.getDeclaredMethod("forName", String::class.java)
val getDeclaredMethod = Class<*>::class.java.getDeclaredMethod("getDeclaredMethod", String::class.java, Array<Class<*>>::class.java )
这里的 'String'指的是'kotlin.String',但是用反射的话我们需要的肯定是'java.lang.String',所以这是一个坑。
这里的"Class<>::class.java"会直接报错:"only classes are allowed on the left hand side of a class literal"
这里需要改成"Class::class.java",这个坑也好解决。
关键是"Array<Class<>>::class.java "这个坑稍微有点复杂,这里的'Array'是'kotlin.Array',Java中“Class[].class”是一个Java数组类型,对应到kotlin中是"arrayOf<Class<*>>()::class.java"。
最后修改后的正确结果如下:
val forName = Class::class.java.getDeclaredMethod("forName", java.lang.String::class.java)
val getDeclaredMethod = Class::class.java.getDeclaredMethod("getDeclaredMethod", java.lang.String::class.java, arrayOf<Class<*>>()::class.java)