使用 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() 方法。出于某种原因,放置companion关键字不允许这样做:/如果这些信息是相关的,我们能重新考虑反对票吗?

伴随对象中的静态方法被放置在封闭类上。 所以在你的情况下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时工作正常

没有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 中运行编译的类文件?

最新更新