gpt4 book ai didi

Kotlin:使用反射设置带注释的lateinit var

转载 作者:行者123 更新时间:2023-12-02 13:16:44 28 4
gpt4 key购买 nike

想象一下,我尝试构建简单的依赖注入(inject)库。其Injector类,当在特定类上调用时,应该注入(inject)所有带有 @Service 注释的属性注解。
例如,给定这个客户端:

class ClientA {
@Service private lateinit var service1: Service1
@Service private lateinit var service2: Service2
private lateinit var service3: Service3
}
调用 injector.inject(ClientA())应该导致 service1service2正在设置(但不是 service3 )。假设 Injector知道如何构造这些对象。
我的问题是如何编写解析类属性、检查它们的注释并在 Kotlin 中设置它们的代码?
由于我在 Android 上,我尝试通过 Java 反射:
fun inject(client: Any) {
val clientClass = client::class.java
val fields = clientClass.declaredFields
for (field in fields) {
if (isAnnotatedForInjection(field)) {
injectField(client, field)
}
}
}

private fun isAnnotatedForInjection(field: Field): Boolean {
val fieldAnnotations = field.annotations
for (annotation in fieldAnnotations) {
if (annotation is Service) {
return true
}
}
return false
}
问题是 fieldAnnotations是空的。转换 ClientA的Java代码我看到以下内容:
public final class ClientA {
private Service1 service1;
private Service2 service2;
private Service3 service3;

/** @deprecated */
// $FF: synthetic method
@Service
private static void service1$annotations() {
}

/** @deprecated */
// $FF: synthetic method
@Service
private static void service2$annotations() {
}
}
看起来 Kotlin 编译器创建了静态方法来聚合属性的注释。有了这些信息,我可以编写一些丑陋的代码来使用 Java 的反射 API 使其工作,但必须有更简洁的方法,对吧?

最佳答案

如果要在字段上放置注释,可以使用 @field:Service .

关于Kotlin:使用反射设置带注释的lateinit var,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62833869/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com