2017-07-06 8 views
2

コンパニオンクラスのjavaClassをコンパニオンオブジェクト内に取得する方法はありますか?コンパニオンオブジェクト内のコンパニオンクラスを取得

は、私はこのような何かをすることによってそれを得ることができたとします

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

しかし、これはclass InheritingClass : TestClass()のために動作しません。それでも、InheritingClassではなくTestClassが与えられます。

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

を見ることができるようにコンパニオンクラス自体が、基準が周りの唯一の他の方法である実際のクラスへの参照を持っていません(逆コンパイルkotlinクラスを参照してください)

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

あなたはクラス名の.Companion部分を切り捨てるか、TestClass::class.javaでハードに参照するかのどちらかとして行うことができます(私の意見では何も問題ありません。ベストソリューション)

+1

それは残念です。また、質問をより明確に更新しました。サブクラスであっても、実行時に実際のクラスを取得したいと思います。 – shutefan

関連する問題