如何在Kotlin中获取当前类的文件名

8

在Java中,我可以使用以下代码:

public class Ex {
    public static void main(String [ ] args) {
        String path = Ex.class.getProtectionDomain().getCodeSource().getLocation().getPath();
        String decodedPath = URLDecoder.decode(path, "UTF-8");
    }
}

但是在 Kotlin 中,主函数是在类之外定义的。我如何获取它的当前文件名?


你想要实现什么目标? - yole
这是否相当于在C中获取argv [0]? - hippietrail
2个回答

6
作为一种解决方法,将main方法放入伴生对象中。 以下代码将显示与您的Java代码相同的路径:
class ExKt {
  companion object {
    @JvmStatic fun main(args: Array<String>) {
        val path = ExKt::class.java.protectionDomain.codeSource.location.path
        println("Kotlin: " + path)
    }
  }
}

由于某些原因,protectionDomain对于Android Activity类返回null :( - Liker777
@Liker777,这段代码与Android运行时不兼容。请参见https://dev59.com/aYbca4cB1Zd3GeqPYaEP - Eugene Krivenja
作为替代方案,我通过栈跟踪获取了带有扩展名的文件名,剩下的问题是如何找到该文件的路径。解决方法是在包中进行递归搜索文件名,但我相信应该有更简单的方法来返回完整路径... 谢谢。 - Liker777

-6

解决方案是:

class Ex() {
    fun m() {
        var p2 = Ex::class.java.simpleName
        println("p2:${p2}")
    }
}

fun main(args: Array<String>) {
    Ex().m()
}

1
很高兴这段代码解决了你的问题,但它并不是你原始问题的答案。这段代码返回的是Java类的名称,而不是编译自哪个文件的名称。 - yole
同意@yole的观点,此外您可以直接从“main”调用Ex :: class.java.simpleName,在那里创建一个“Ex”实例没有意义。 - Eugene Krivenja

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接