标签: kotlin-java-interop

从 Java(和 Kotlin)隐藏 Kotlin 对象的 INSTANCE 字段

简短的问题

我可以将 Kotlin 对象INSTANCE(对于 Java 互操作)的可见性修改为internal或更低吗?

长问题

我正在编写一个库,我想要一个用 Kotlin 编写的API 文件/类,它公开一个可以从 Java 或 Kotlin 调用的函数,如下所示:

科特林:

API.function()
Run Code Online (Sandbox Code Playgroud)

爪哇:

API.function()
Run Code Online (Sandbox Code Playgroud)

我可以通过这样写来实现这一点:

科特林:

object API {
    @JvmStatic
    fun function() = TODO()
}
Run Code Online (Sandbox Code Playgroud)

不过,现在我也可以这样做:

爪哇:

API.function();
Run Code Online (Sandbox Code Playgroud)

为了简单起见,我想阻止这种访问,以INSTANCE将 API 界面保持在最低限度。

我可以将可见性修改为INSTANCEinternal更低吗?

这可能是不可能的,因为对API(来自 Kotlin)的任何调用都会返回对象的实例,并且该实例也应该被隐藏才能实现这一点。不过,我很好奇它是否没有受到重大黑客攻击。

使用 Java 的解决方案是用APIJava 编写:

object API {
    @JvmStatic
    fun function() = TODO()
}
Run Code Online (Sandbox Code Playgroud)

但是,我正在寻找用 Kotlin 编写的解决方案。

java singleton interop kotlin kotlin-java-interop

6
推荐指数
1
解决办法
2928
查看次数

指定 1.8 以外的 -jvm-target / jvmTarget 版本的好处

从 Kotlin 1.6.0 开始,对于 Kotlin/JVM 项目,可以指定-jvm-target version最高可达 Java 的选项17,请参阅常规Gradle 插件文档。

这样做有什么好处呢?除了 的默认值之外,我找不到太多关于指定其他值的好处1.8

我能找到的唯一的东西是:

两者对我来说似乎都可以忽略不计。

特别是因为当指定更高的目标时,人们将失去在使用 Java 1.8 的项目中使用生成的工件的能力,这似乎是不可取的,尤其是对于库而言。

我在这里错过了什么吗?

java jvm invokedynamic kotlin kotlin-java-interop

6
推荐指数
1
解决办法
2051
查看次数

直接从 Java 访问 kotlin 公共字段,无需 getter

下面是一个来自 Android 的模式示例(只是一个例子,对 android 细节不感兴趣):

/*Im a kotlin file*/
class ListItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    val text: = itemView.my_view
}
Run Code Online (Sandbox Code Playgroud)

然后模式是您访问文本字段,如下所示:

/*Im a Java file*/
holder.text.setText("Metasyntactic variable");
Run Code Online (Sandbox Code Playgroud)

不幸的是,有一个带有固定结构的大文件执行上述操作,然后有:

/*Im a Java file, but this particular holder is a kotlin file*/
holder.getText().setText("Metasyntactic variable");
Run Code Online (Sandbox Code Playgroud)

有没有可能解决这个问题?也许有一些@Jvm注释

kotlin kotlin-java-interop

5
推荐指数
1
解决办法
497
查看次数

Kotlin方法接受内联类作为参数-如何从Java访问?

假设我有:

inline class Email(value: String)

fun something(email: Email)

现在,如果我想something()从Java 打电话,就不能。因为任何将内联类作为参数接受的方法都是“混杂的”(有关此内容,参见:https : //kotlinlang.org/docs/reference/inline-classes.html#mangling)据我了解,重整会重命名方法名称中包含“-”,这是Java中的无效字符,因此从Java角度来看,该方法实际上是不可见的。这可能是出于强类型安全性的目的。但是我确实需要使该方法可从Java和Kotlin调用。您知道一些解决方法吗?

java kotlin kotlin-inline-class kotlin-java-interop

4
推荐指数
1
解决办法
117
查看次数

如何为Java制作Kotlin静态变量和函数?

自从Google使Kotlin成为Android的一流语言以来,与如何以Kotlin的“ Java风格”执行某些事情有关的问题就越来越多。最常见的是如何static在Kotlin中进行变量设置。那么,如何使Kotlin成为static变量和函数呢?

java kotlin kotlin-java-interop

4
推荐指数
1
解决办法
467
查看次数

为什么生成的 getter 方法中有美元符号?

我正在将我的代码库从 Java 转换为 Kotlin,并且我们一次转换几个类。在今天的这个过程中,我注意到一个非常奇怪的互操作问题,我希望有办法解决。

我有一个受包保护的 Java 类,我将其转换为内部 Kotlin 类。这是该课程的删节版本:

internal class Request private constructor(internal val method: String) {

...

}
Run Code Online (Sandbox Code Playgroud)

我注意到,当我尝试使用 Java 中的此类(在同一包中)时,它会将构建名称和美元符号附加到我的 getter 的末尾method。像这样:

request.getMethod$myproject_debug()

如果我将方法字段公开,这种情况就会停止发生。我真的希望有办法解决这个问题,因为如果没有办法的话,转向 Kotlin 将是一个大问题。

kotlin kotlin-java-interop

3
推荐指数
1
解决办法
591
查看次数