使用反射读取Kotlin函数注释值?

时间:2017-11-27 12:04:42

标签: android kotlin retrofit2 kotlin-reflect

给定这样的接口方法(Android Retrofit),如何在运行时从Kotlin代码中读取注释参数中指定的URL路径?

ApiDefinition接口:

@GET("/api/somepath/objects/")
fun getObjects(...)

阅读注释值:

val method = ApiDefinition::getObjects.javaMethod
val verb = method!!.annotations[0].annotationClass.simpleName ?: ""
// verb contains "GET" as expected
// But how to get the path specified in the annotation?
val path = method!!.annotations[0].????????

更新1

感谢您的回答。我还在苦苦挣扎,因为我无法看到用于执行以下操作的类型:

val apiMethod = ApiDefinition::getObjects

....然后将该函数引用传递给这样的方法(它被重用)

private fun getHttpPathFromAnnotation(method: Method?) : String {
    val a = method!!.annotations[0].message
}

IntelliJ IDE建议我使用KFunction5<>作为一个函数参数类型(就我所见,它并不存在),似乎也要求我为方法指定所有参数类型,这使得通用调用无法获取注释属性。不是Kotlin相当于"方法"?,这种类型会接受任何方法吗?我尝试了KFunction,没有成功。

更新2

感谢您澄清事情。我已经达到了这一点:

ApiDefinition(改造界面)

@GET(API_ENDPOINT_LOCATIONS)
fun getLocations(@Header(API_HEADER_TIMESTAMP) timestamp: String,
                 @Header(API_HEADER_SIGNATURE) encryptedSignature: String,
                 @Header(API_HEADER_TOKEN) token: String,
                 @Header(API_HEADER_USERNAME) username: String
                 ): Call<List<Location>>

检索注释参数的方法:

private fun <T> getHttpPathFromAnnotation(method: KFunction<T>) : String {
    return method.annotations.filterIsInstance<GET>().get(0).value
}

调用以获取特定方法的路径参数:

    val path = getHttpPathFromAnnotation<ApiDefinition>(ApiDefinition::getLocations as KFunction<ApiDefinition>)

隐式强制转换似乎是必要的,或者类型参数要求我提供KFunction5类型。

此代码有效,但它具有硬编码的GET注释,有没有办法使其更通用?我怀疑我可能需要寻找GET,POST和PUT并返回第一场比赛。

0 个答案:

没有答案