问题标签 [kotlin-reflect]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
302 浏览

kotlin - 检查类是否是 KParameter 的有效值

给出以下示例代码

如何检查是否textParam接受stringClass作为参数?

0 投票
1 回答
1442 浏览

kotlin - 如何通过反射获取 kotlin 包

Kotlin 反射库定义KDeclarationContainer,其中Represents an entity which may contain declarations of any other entities, such as a class or a package.

this::classreturn KClass,它 extends KDeclarationContainer,但是我如何获得父级KDeclarationContainer(a KPackage?)

0 投票
1 回答
612 浏览

kotlin - 绑定类引用返回协变类型的目的是什么?

我正在玩反射,我遇到了这个问题。通过::class语法使用绑定类引用时,我得到一个协变 KClass 类型:

正如我从文档中了解到的那样,这将返回对象的确切类型,以防它是 的子类型的实例T,因此是方差修饰符。但是,这会阻止检索T类中声明的属性并获取它们的值(这是我想要做的)

我发现一个解决方案是javaClass.kotlin在对象引用上使用扩展函数来获取不变类型:

这样,我既可以在运行时获得确切的类型,也可以使用该类型。

有趣的是,如果我使用超类型而不是泛型,使用后一种方法我仍然可以访问正确的类型,而无需变化:

如果我猜对了,::class就等于调用 java getClass,它返回一个带有通配符的变体类型,javaClass而是一个getClass带有特定类型的强制转换。尽管如此,我还是不明白为什么我需要一个协变 KClass,因为它限制我只生成类型,因为还有其他方法可以在运行时访问确切的类并自由使用它,我想知道更多immediate::class应该按设计返回一个不变的类型。

0 投票
1 回答
784 浏览

android-gradle-plugin - Kotlin 反映 proguard SmallSortedMap

我收到这些警告,它们破坏了我在任务上的发布版本transformClassesAndResourcesWithProguardForAppRelease

我知道我可以忽略警告或通知 proguard 不要通过 using 发出警告,-dontwarn但我想知道是否有其他人遇到过这个问题并实际上找到了正确的修复程序。

我正在使用 Kotlin 版本1.1.4-2

0 投票
2 回答
2043 浏览

kotlin - 如何将没有实例参数的 KFunction 转换为带有它的 KFunction?

鉴于上面的代码,我如何将它转换为具有内置实例的函数,以便在调用时我可以只传递参数而不传递instance(我可以使用X()::someFunc,但这不是这个问题的重点)

0 投票
2 回答
1738 浏览

reflection - 如何使用 Kotlin 中的默认构造函数参数值实例化对象?

我有具有默认值的数据类。

当某些值为空时,Java 反射无法实例化类。我得到了例外

这是因为java.lang.reflect.Constructor<T>.instantiateClass方法需要不为空的参数。

我有类型信息,我有构造函数定义,但我不确定如何调用构造函数以便它使用默认值(这些值来自数据库并且categories可以是null)。有没有办法在 Kotlin 中实现这一点?

0 投票
0 回答
352 浏览

android - 21 岁以下的 Android 上使用 MultiDex 的 Kotlin 代表

我有以下代表...

该代表旨在处理股份偏好。当我的应用程序变为 MultiDex 时,就会出现问题。当我在活动中使用下面的代码时,应用程序崩溃。

但是,如果我将代码更改为这个。应用程序崩溃

我已经阅读了这个文件,它有一些通知..

https://developer.android.com/studio/build/multidex.html

注意:在 MultiDex.install() 完成之前,不要通过反射或 JNI 执行 MultiDex.install() 或任何其他代码。Multidex 跟踪不会跟随这些调用,导致 ClassNotFoundException 或由于 DEX 文件之间的错误类分区而导致验证错误。

总之,我想知道在这种情况下会发生什么。

  • 应用程序崩溃发生在低于 21 的 Android 上
  • kotlin 委托使用反射
  • 为什么从字段变量更改为局部变量可以解决问题?
  • Logcat 没有帮助

日志猫

0 投票
0 回答
1487 浏览

android - KotlinReflectionInternalError 数据类

尝试在改造服务中使用数据类作为结果类型时收到以下错误。

老实说,我什至不确定这个错误是什么意思,也没有找到很多关于它的资源。类描述相当模糊:

Kotlin 反射已达到无法恢复的不一致状态的信号。

唯一使用反射的地方是在 Moshi 内,但我不知道是什么导致了这个问题。


代码

这是数据类:

AuthenticationService:_

我使用 Moshi 作为 JSON 转换器,我已经KotlinJsonAdapterFactoryMoshi.Builder.


更新

通过尝试AuthenticationResponse直接使用 Moshi 创建适配器,我可以可靠地重现错误。

KotlinReflectionInternalError上面的代码在尝试创建adapter值时同样失败。

0 投票
1 回答
5029 浏览

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

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

ApiDefinition 接口:

读取注解值:

更新 1

感谢您的回答。我仍在苦苦挣扎,因为我看不到使用什么类型来执行以下操作:

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

IntelliJ IDE 建议我使用 KFunction5<> 作为函数参数类型(据我所见,它不存在),并且似乎要求我也为该方法指定所有参数类型,这使得通用调用 get注释属性不可能。没有 Kotlin 等效的“方法”吗?一种可以接受任何方法的类型?我尝试了 KFunction,但没有成功。

更新 2

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

ApiDefinition(改造接口)

检索注释参数的方法:

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

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

此代码有效,但它具有硬编码的 GET 注释,有没有办法让它更通用?我怀疑我可能需要查找 GET、POST 和 PUT 并返回第一个匹配项。

0 投票
1 回答
1191 浏览

reflection - 在 Kotlin 中对具有默认参数的函数使用 callBy 时出错

我尝试使用默认参数值调用函数,而不在 Kotlin 中放置参数。

例如:

我有一个例外:

奇怪,因为参数不是必需的,而是可选的......