问题标签 [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 投票
0 回答
36 浏览

kotlin - 是否可以复制 KClass 并更改其属性?

我想做的是使用 Kotlin 反射来制作一个类的副本并将其所有属性设置为可选/可为空。

例如

显然 KClass 和 KType 没有copy方法。有什么办法可以实现我想做的事情吗?

0 投票
0 回答
45 浏览

kotlin - 如何使用反射查看一个类是否有一个 init 块?

如果我有一个像下面这样的 Kotlin 类:

我如何确定这个类有一个使用反射的 init 块?

init 块没有出现在中Foo::class.members,我看不到从Foo::class.constructors.

有什么方法可以找到有关使用 init 块的信息kotlin.reflect

0 投票
1 回答
95 浏览

kotlin - Kotlin 是否可以委托函数或函数参数?

我想要例如:

无论是反射还是其他方式。

我目前拥有的是:

这样我就可以打电话

但是我需要发送不知道的参数。我希望我的编译器知道可以发送哪些参数。否则,我可以编写以下内容,直到运行时才会失败:

请注意,我希望它具有不同的名称,而不是使用接口。

0 投票
1 回答
99 浏览

kotlin - 为什么我不能访问`::class.companionObject`?

给定类的实例,我正在尝试使用已知接口访问未知类的伴随对象。

下面的代码:

输出:

我认为这不是以下任何一个问题的重复,因为我特意询问发生了什么变化或我误解了什么,因此以下两个问题中的解决方案对我不起作用:

如何从 kotlin 中的对象实例访问伴随对象?

Kotlin 使用反射调用伴随函数

0 投票
1 回答
374 浏览

android - 使用 proguard / R8 删除数据类元数据

我有一个包含一些数据类的包,我试图在运行时使用 Kotlin 反射访问构造函数clazz.primaryConstructor,一切都按预期工作,但是当我启用 R8 时,数据类元数据被删除,例如当我检查KClass isData它是否返回 false并且主构造函数也是空的,只有在启用 R8 时才会发生。我尝试了一切,包括将@keep注释添加到所有数据类并添加规则以将所有内容保留在模型包中,我还添加了这些规则

但仍然没有运气,知道出了什么问题或如何解决这个问题吗?

示例回购

提前致谢。

0 投票
0 回答
41 浏览

kotlin - 如何使用与发布版本中相同的混淆文件对函数进行单元测试?

在我的应用程序中,我最近将 Kotlin 从 1.5.31 更新到了 1.6.10。从那时起,使用反射 (kotlin-reflect) 的特定功能停止按预期工作。它在 1.5.31 中运行良好。

现在,当我运行调试版本时,该功能可以正常工作,但是当我运行发布版本(缩小和混淆的版本)时,它却没有。
这是我纯偶然发现的(不幸的是,我没有使用 TDD……是的,我知道我应该这样做,但有时我们学习困难重重),所以我决定是时候开始测试以避免这种意外问题了,尤其是这个。

我一直在做一些研究,但我没有发现如何做这个具体的事情。
这个想法是能够运行一个测试来捕捉这个问题,这个问题只有在代码被混淆时才会出现。
我已经实现了一个简单的测试并且测试没有失败,因为它使用的代码没有被混淆。

测试如下:

您可能已经猜到了,我的文件中-keep实现了一些规则proguard-rules.pro,否则即使在 Kotlin 1.5.31 上代码也无法运行。

我一直在阅读有关testProguardFilesgradle 的内容,但我不知道这是否有用,或者至少我无法使其按预期工作。

这是我build.gradle文件的一部分:

如果您需要任何其他信息,请在评论中告诉我,我很乐意分享。

以防万一,让我们澄清一下,这个问题的目的是知道如何进行测试,当代码由于被混淆而改变其行为时应该失败的测试,而不是在 Kotlin 版本之间发生了哪些改变而破坏了我的代码......是另一个故事。

0 投票
1 回答
94 浏览

kotlin - Kotlin - 合并两个数据类

数据类

以 json 表示的类数据值。

我想将元素与“ALLOGENE THERAPEUTICS”和“CELECTIS”的关键值结合起来,并用“STUB”替换关键值。

组合元素时,必须组合所有“计数”值。

并且必须添加不存在的元素。

因此,结果应如下所示。

如何使用 Kotlin 巧妙地编写代码?

作为参考,数据类的值用json表示,结果值必须是数据类。

这是迄今为止的进展:

为创建合并副本的数据创建一个函数

将合并列表折叠成单个数据项并将它们重新添加到一起。

并结合子元素。

这是目前的情况。

这样,深度为2的元素会正常工作,但深度为3的元素不会被添加。

例如,STUB 下最多“N”被组合,但“N”下的“S1”和“S2”不被组合。

因此,以这种方式输出当前结果。

所有的子元素如何组合和实现?

0 投票
1 回答
20 浏览

kotlin - 如何找到伴生对象所有者的 KClass?

我正在尝试获取拥有伴随对象的类,以便我可以在伴随对象中使用内联技术创建记录器,但引用正在记录的主类而不是伴随对象。

问题是我找不到获得伴生对象所有者的方法,我该怎么做?

预期的用例:

A:

乙:

0 投票
0 回答
29 浏览

kotlin - 如何在运行时检查 Kotlin 类型(KClass)是否为基本(原始)(例如反射 API)?

Kotlin 规范将基本类型声明为“某些类型可以具有特殊的内部表示 - 例如,数字、字符和布尔值可以在运行时表示为原始值”。https://kotlinlang.org/docs/basic-types.html

然而,我没有想出任何方法来知道 Kotlin 中的类型表示,即实例KClass是否是基本类型?


范围

我们需要将String值解析并转换为强类型实例,对于“基本类型”,我们希望使用相应的to<basic type>辅助方法,如 JavavalueOf装箱

0 投票
0 回答
24 浏览

android - Moshi:什么时候需要反射?

目前使用 Moshi 和 Retrofit 但需要回顾一下,因为我注意到我没有正确实施它并且在添加kotlin-reflect依赖项时感到困惑。

根据自述文件

反射适配器需要以下附加依赖项:

我认为上述依赖项是实际的 Moshi 依赖项,但似乎不需要它,除非您使用KotlinJsonAdapterFactory. KotlinJsonAdapterFactory无论如何,它负责将 Kotlin 类转换为 JSON 吗?

目前我有这个依赖和注释处理器。

如果我仅将 Moshi 与 Codegen 一起使用,我可以删除其他的并最终只依赖这两个依赖项吗?