使用Kotlin在子类中执行静态方法编译?

有没有一种方法可以在Kotlin中的现有类中静态编译main()方法? 我试图让Gradle使用main()方法构建这个应用程序,但是我没有运气。 我也一直在尝试几个解决方法…

 class MyApp: App() { override val primaryView = MyView::class companion object Launcher { @JvmStatic fun main(args: Array<String>): Unit { launch(*args) } } } 

在我的Gradle脚本中,我试图指定MyApp类有一个main()方法。 它错误了,但是当我打电话run时找不到类。

 mainClassName = 'path.to.application.MyApp' 

编辑

我为这个混淆道歉,但是我的问题的一部分可能与子类化有关,而不一定是找到main()类。

main()函数需要访问App定义的launch()方法。 出于某种原因,关联关键字不允许这样做:/如果这个信息是相关的,我们可以重新考虑downvotes吗?

伴随对象中的静态方法放置在封闭类中。 所以你的情况MyApp 。 无论您如何命名伴随对象,都是如此,在运行该类时不需要以任何方式引用伴随。

因此,您的代码是正确的,假设以下是正确的:

  1. 你的应用程序插件应用在你的Gradle中
  2. 您将包含以上代码的包命名为path.to.application (您不显示包声明)
  3. 你得到一个path.to.application.MyApp没有找到类错误,并匹配#2,(你不显示从Gradle实际的错误)
  4. 您正在运行正确的gradle任务(您正在运行哪个任务?)
  5. 代码实际上是编译的,看你最新的注释表明你可能有一个编译器错误( launch()方法不能从同伴访问),这意味着你不能运行一些尚未编译的东西。

你可以做什么来检查类名是右键单击Intellij IDEA中的main()方法,然后选择运行/调试选项下方的create path.to.app...菜单选项,当打开运行时配置对话框可以在那里看到完整的类名。 这应该是在你的Gradle中使用的。 如果您已经有了运行时配置,那么只需在那里查看完整的类名即可。 如果这不起作用,问题就在别处,你需要提供缺少的信息(什么是Gradle任务,什么是实际的错误,这个类的包声明是什么)

有些信息是从这个问题,将有助于缩小这个问题。

这个例子:

 package org.test.kotlin class MyApp { companion object Launcher { @JvmStatic fun main(args: Array<String>) { println("hello") } } } 

运行类org.test.kotlin.MyApp时可以正常org.test.kotlin.MyApp

那么这个,没有Launcher这个词:

 package org.test.kotlin class MyApp { companion object { @JvmStatic fun main(args: Array<String>) { println("hello") } } } 

而这个意外的工作,但没有做你期望的,但是创建一个嵌套的类,并在那里添加静态和运行使用类org.test.kotlin.MyApp.Launcher 。 如果这是工作,那么问题是没有显示它正在使用的实际主类名称是失败的:

 package org.test.kotlin class MyApp { object Launcher { @JvmStatic fun main(args: Array<String>) { println("hello") } } } 

关于可能的编译错误(上面#5):在你的代码中你引用了你不显示的launch()方法,也许它是在祖先类中。 但是你没有创建任何类的实例。 所以这将失败,编译器错误。 将其更改为:

 class MyApp: App() { override val primaryView = MyView::class companion object { @JvmStatic fun main(args: Array<String>): Unit { MyApp().launch(*args) } } } 

这些其他相关问题也有类似的提示:

  • 你的关于如何运行的问题在另一个SO问题中得到了解答: https : //stackoverflow.com/a/26402542/3679676
  • 如何从命令行运行Kotlin类?
  • 如何在Kotlin中运行编译后的类文件?