【问题标题】:What is the meaning of ::class.java::class.java 是什么意思
【发布时间】:2021-10-11 14:48:52
【问题描述】:

//我正在尝试通过 retroFir 2 访问 web api,所以我创建了一个构建器,我不明白这条线在做什么,我如何能够通过我的界面来实现这一点

 val retrofitBuilder = Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create())
                .baseUrl(BASE_URL)
                .build()

                //meaning of this line
                **.create(ApiInterface::class.java)**

这是界面

interface ApiInterface {

    @GET("users")
    fun getData():Call<List<FakeJsonDataItemItem>>

}

我在里面传递了什么

【问题讨论】:

    标签: java android kotlin retrofit2


    【解决方案1】:

    通过使用::class.java,您可以获得一个类的实例。 它是 Java 反射 API。

    如果要获取 Java 类引用,则必须在 KClass 实例上使用 .java 属性:

    val c = ExampleClass::class.java  // reference type of java
    

    通过使用::class,您将获得一个KClass 实例。它是 Kotlin 反射 API。 当我们使用如下任何类类型创建对象时,引用类型将是 KClass 类型。

    val c = ExampleClass::class  // reference type of KClass
    

    Retrofit create() 方法在后台验证接口。之后,如果接口通过验证,则使用 Retrofit 创建 API 接口实例,从 Retrofit 返回的实例实际上是一个代理类,是接口在运行时的动态实现。

    【讨论】:

    • 这里的实例是指那个类的对象??
    【解决方案2】:

    Class 对象基本上描述了一种特定类型,例如 Class&lt;String&gt; 是描述String 类的特殊对象。

    它们包含useful information,例如该类型具有哪些字段,它具有哪些方法等。这可能是您的 Retrofit 调用正在执行的操作 - 获取接口定义,查看其上定义的方法(以及重要的注释等) else),并生成一些与之匹配的代码。

    Class 对象的一个​​真正常见用途是作为类型定义,您可以传递和引用它。你在泛型函数中看到了很多。

    它们还允许您创建该类型的实例,方法是调用 getConstructor() 然后调用 newInstance() - 如果您想说“这是我希望您创建的对象的类型”而不对特定的构造函数调用进行硬编码,这可能很有用对于每种类型。您可以(例如)创建一个在 Android 中创建和显示 Fragments 的函数,您可以通过传入片段类型的 Class 来调用该函数,并让该函数调用默认构造函数并在适当的时候创建一个实例.


    在 Kotlin 中,您调用 MyClass.class 而不是 MyClass::class - 但这会给您一个 KClass 对象,它是 Class 的 Kotlin 版本,其中一些 Kotlin 特定的附加功能(例如它是否是 @ 987654335@等)。

    如果您想要等效的 Java Class 对象(大多数库将使用,除非它们是 Kotlin 特定的),您可以调用 KClass 上的 java 属性,即 MyClass::class.java,它为您提供Class&lt;MyClass&gt; 对象 ​

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-12
      • 2017-06-11
      • 2018-03-05
      • 2023-03-27
      • 1970-01-01
      • 2013-03-09
      • 2020-05-01
      相关资源
      最近更新 更多