java—有没有什么方法可以从改装的注解处理器中“隐藏”kotlin函数?

7vhp5slm  于 2021-07-07  发布在  Java
关注(0)|答案(1)|浏览(316)

我有几个界面如下所示:

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

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

我正在努力实现一个 Context 以类似于kotlin的方式实现 CoroutineContext . 当我试图添加我的改型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 .
我相信,如果我能够使改装后的注解处理器跳过继承的函数 Context.Element 这个问题会解决的。有什么办法吗?任何 @Transient 比如函数的注解?我试着用 @JvmSynthetic 但运气不好。

xxe27gdn

xxe27gdn1#

这里的问题不在于注解处理器,而是在于改造的工作方式。它不生成实现类,而是在运行时创建一个代理对象,该代理对象处理所有方法调用并将它们路由到适当的处理程序。所以很明显它不能处理非服务方法。此外,还不清楚如何为该非注解方法提供实现。所以我想说这目前是不可能的。
编辑:由于您正在使用接口上的默认方法来提供实现,我相信它通常应该可以工作,因为 Retrofit 分别处理默认方法。这里的问题可能是 Retrofit 只知道java默认方法,默认情况下kotlin不使用它们(为了与Java7及以下版本兼容)。因此,如果让编译器生成java默认方法,它应该可以工作。详情请看这篇文章。

相关问题