Warm tip: This article is reproduced from serverfault.com, please click

java-有什么办法可以从Retrofit注释处理器中“隐藏” Kotlin函数吗?

(java - Is there any way to "hide" a Kotlin function from Retrofit annotation processor?)

发布于 2020-11-28 15:03:55

我有一些类似于以下内容的界面:

interface ApiInterface : Context.Element {
    @GET(Urls.url)
    suspend fun getSomeData(): Data
}

interface Context.Element {
    operator fun plus(context: Context): Context
}

我正在尝试以Context类似Kotlin的 方式实施实现CoroutineContext当我尝试添加Retrofit http接口时,Context.Element它最终继承了一些其他功能。该代码编译并运行正常,直到我把从我ApiInterface实例功能,从继承Context.Element,因此没有任何@GET@POST或任何改装的注释。

如果我运行以下代码:

val context = ApiInterfaceImpl()
context + DifferentApiInterfaceImpl()

我收到了Exception in thread "main" java.lang.IllegalArgumentException: HTTP method annotation is required (e.g., @GET, @POST, etc.). for method Context.plus

我相信,如果我能够使Retrofit批注处理器跳过从此Context.Element问题继承的功能,将会得到解决。有什么办法吗?有没有@Transient类似的功能注释?我尝试使用,@JvmSynthetic但没有运气。

Questioner
admqueiroga
Viewed
0
esentsov 2020-11-29 03:22:45

这里的问题不在注解处理器中,而是在改造工作方式中。它不会生成实现类,而是在运行时创建一个代理对象,并且该代理对象处理所有方法调用并将它们路由到适当的处理程序。因此很显然,它无法处理非服务方法。同样也不清楚如何为该非注释方法提供实现。所以我想说这目前是不可能的。

编辑: 由于你在接口上使用默认方法来提供实现,因此我相信它通常应该可以正常工作,因为Retrofit单独处理默认方法。这里的问题可能是Retrofit仅了解Java默认方法,默认情况下,kotlin不使用它们(以与Java 7及以下版本兼容)。因此,如果使编译器生成java默认方法,则它应该可以工作。请查看此帖子以获取详细信息。