2017-07-06 80 views
2

有沒有辦法讓伴隨對象內的伴隨班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

+0

爲什麼'javaClass'不存在? – miensol

+0

那麼'val clazz = TestClass :: class.java'呢? – marstran

+0

啊,我的不好,澄清了這個問題 - 我想在編譯時不知道名稱的情況下上課。 – shutefan

回答

1

同伴類本身沒有參考實際的類,你可以在這個字節碼看

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 { 
     } 
    } 
} 

參考僅僅是周圍的其他方式(參見反編譯科特林級)

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

所以你可以像剛纔那樣通過切斷類名的.Companion部分來做到這一點,或者你可以用TestClass::class.java(我認爲沒有問題和最好的解決方案)很難引用它

+1

這是一個恥辱。此外,更新的問題更加清楚:即使它是子類,我也希望在運行時獲得實際的類。 – shutefan