在同伴对象中获得伴侣课程

有没有一种方法来获取伴随对象内的伴随类的javaClass而不知道它的名字?

我想我可以通过做这样的事情得到它:

 open class TestClass { companion object { init { val clazz = Class.forName(this::class.java.canonicalName.removeSuffix(".Companion")) } } } 

但是,这不适用于class InheritingClass : TestClass() 。 它仍然会给我TestClass,而不是InheritingClass。

我希望有更直接的东西,像this::class.companionClass

伴随类本身没有引用实际的类,就像你在这个字节码中看到的那样

 public final class TestClass$Companion { private TestClass$Companion() { // <init> //()V <localVar:index=0 , name=this , desc=LTestClass$Companion;, sig=null, start=L1, end=L2> L1 { aload0 // reference to self invokespecial java/lang/Object <init>(()V); return } L2 { } } public TestClass$Companion(kotlin.jvm.internal.DefaultConstructorMarker arg0) { // <init> //(Lkotlin/jvm/internal/DefaultConstructorMarker;)V <localVar:index=0 , name=this , desc=LTestClass$Companion;, sig=null, start=L1, end=L2> <localVar:index=1 , name=$constructor_marker , desc=Lkotlin/jvm/internal/DefaultConstructorMarker;, sig=null, start=L1, end=L2> L1 { aload0 // reference to self invokespecial TestClass$Companion <init>(()V); return } L2 { } } } 

引用只是相反的(参见反编译的kotlin类)

 public final class TestClass { public static final Companion companion = ... } 

所以你可以按照你刚刚做的那样.Companion类名的.Companion部分,或者用TestClass::class.java来强制引用它(我认为没有问题和最好的解决方案)