如何访问外部课程'来自kotlin的伴侣对象的javaClass.simpleName?

时间:2018-01-31 02:15:45

标签: static kotlin companion-object kotlin-companion

我希望能够从它的伴随对象中访问我的类的simpleName。

我想这样:

val o1 = Outer("foo")
val o2 = Outer("bar")

打印以下输出:

Outer: hello
Outer: foo
Outer: bar

实际用例在java中是这样的:

class Outer {
    static final String TAG = Outer.class.simpleName();
    // and now I'm able to use Outer.TAG or just TAG in both static and non-static methods
}

我尝试了两件事:

  1. 将外部的simpleName分配给配套对象的COMPANION_TAG,然后使用来自配套初始化的COMPANION_TAG和所有外部功能。我可以从我需要的任何地方访问COMPANION_TAG,但不幸的是我只能得到" Companion"而不是"外面"这样。

  2. 从配套对象的init访问Outer.OUTER_TAG。问题在于我无法找到访问它的方法。

  3. 以下是代码:

    class Outer(str: String) {
        private val OUTER_TAG = javaClass.simpleName
        companion object {
            @JvmStatic val COMPANION_TAG = PullDownAnimationLayout.javaClass.simpleName // gives "Companion" :(
            init {
                // how can I access OUTER_TAG?
                Log.d(OUTER_TAG, "hello") // this gives an error
            }
        }
        init {
            Log.d(OUTER_TAG, str) // Outer: ... :)
            Log.d(INNER_TAG, str) // Companion: ... :(
        }
    }
    
    val o1 = Outer()
    val o2 = Outer()
    

1 个答案:

答案 0 :(得分:3)

为了在Kotlin实现这一目标,

class Outer {
    static final String TAG = Outer.class.simpleName();
    // and now I'm able to use Outer.TAG or just TAG in both static and non-static methods
}

应该是

class Outer {
    companion object {
        val Tag = Outer::class.java.simpleName
        val Tag2 = Outer.javaClass.simpleName // This will not work
    }
}

println(Outer.Tag)  // print Outer
println(Outer.Tag2) // print Companion

我认为你误解了companion是什么。 companion类似于Java静态。请参阅此discussion