gpt4 book ai didi

kotlin - 如何在kotlin中使用reflect访问静态字段?

转载 作者:行者123 更新时间:2023-12-02 06:37:04 26 4
gpt4 key购买 nike

我在java中有这个抽象类:

abstract class AbsApiTestCase<T> {
T mApi;

@Before
public void setUp() throws Exception {
mApi = instanceApi((Class<T>) (
(ParameterizedType) getClass().getGenericSuperclass())
.getActualTypeArguments()[0]);
}

static <T> T instanceApi(Class<T> clazz) throws Exception {
return new Retrofit.Builder()
.baseUrl(clazz.getField("BASE_URL").get(null).toString())
.addConverterFactory(GsonConverterFactory.create(
new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create()))
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(getClient())
.build().create(clazz);

}
// some code
}

API 看起来像这样:

public interface GithubApi {
String BASE_URL = "https://api.github.com/";
// some code
}

可以这样使用:

public class GithubApiTest extends AbsApiTestCase<GithubApi> {
// some code
}

但是当我将代码转换为 kotlin 时,静态字段 BASE_URL 如下所示:

interface GithubApi {
companion object {
val BASE_URL = "https://api.github.com/"
}
// some code
}

并且 BASE_URL 无法像上面那样访问。我发现有一个 @JvmField 注释,但 Android studio 说 JvmField 无法应用于接口(interface)的伴随对象中定义的属性

有没有办法访问这个“静态字段”?

最佳答案

如何将 BASE_URL 设为编译时常量?

interface GithubApi {
companion object {
const val BASE_URL = "https://api.github.com/"
}
}

在字节码级别,BASE_URLGithubApi 接口(interface)的静态字段。

public interface GithubApi {
public static final GithubApi$Companion Companion;

public static final java.lang.String BASE_URL;

static {};
Code:
0: new #26 // class GithubApi$Companion
3: dup
4: aconst_null
5: invokespecial #30 // Method GithubApi$Companion."<init>":(Lkotlin/jvm/internal/DefaultConstructorMarker;)V
8: putstatic #32 // Field Companion:LGithubApi$Companion;
11: return
}

关于kotlin - 如何在kotlin中使用reflect访问静态字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37940196/

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