gpt4 book ai didi

kotlin - 在伴生对象中获取伴生类

转载 作者:行者123 更新时间:2023-12-04 19:29:53 27 4
gpt4 key购买 nike

有没有办法获得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 来像刚才那样进行操作。类名的一部分,或者你用 TestClass::class.java 硬引用它(在我看来什么是没有问题的最佳解决方案)

关于kotlin - 在伴生对象中获取伴生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44947234/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com