如何使用KClass反射在Kotlin中区分类和接口

7
我使用Kotlin的KClass按名称查找类,代码如下:
val i: KClass<*> = Class.forName("SampleClass").kotlin

然而,我希望省略接口。到目前为止,我是通过构造函数将接口与类区分开来的。
val i: KClass<*> = Class.forName(input).kotlin

if (i.constructors.isEmpty()){
    println("This is an interface")
}else{
    println("This is a class")
}

我认为这并不是很干净的。我正在寻找与此类似的东西。

i.isInterface

这种东西存在吗?

你是否多次重复使用这段代码?如果是的话,尝试创建自己的 i.isInterface() 函数。 - fin444
不是答案,但为什么不直接使用SampleClass :: class来获取KClass呢? - s1m0nw1
@s1m0nw1 我正在将类的名称作为参数传递,它是一个字符串。执行 input::class 会返回 String 类的详细信息,而不是我实际要查找的内容。 - PaulB
@fin444 我其实已经做了。上面的片段只是一个例子。 - PaulB
1个回答

8
请注意,构造函数计数解决方案可能不适用于通用用途。例如,Kotlin包门面类也没有任何构造函数,但它们不是接口(更新:它们的构造函数甚至不能使用kotlin-reflect反射,就像匿名类、KFunction和其他类一样)。
kotlin-reflect中没有一个函数/属性可以直接进行检查。在JVM上,您可以使用i.java.isInterface或创建扩展来实现简单的检查:
val KClass<*>.isInterface get() = java.isInterface

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接