标签: kotlin-reflect

Proguard和Kotlin-Reflect/Kotlin Annotations

寻找一些将职业选手放入项目的人的帮助.

kotlin-reflect使用的注释(jackson-module-kotlin v v2.8.8所需的依赖关系)在升级到kotlin 1.1.2-3之后被剥离.proguard的错误是: Warning:kotlin.reflect.jvm.internal.impl.descriptors.CallableDescriptor: can't find referenced class org.jetbrains.annotations.ReadOnly

这种情况发生在一些注释中,而不仅仅是ReadOnly.我们尝试添加一个好的'捕获所有,但错误仍然存​​在:

-keep class org.jetbrains.kotlin.** { *; }
-keep class org.jetbrains.annotations.** { *; }
-keepclassmembers class ** {
  @org.jetbrains.annotations.ReadOnly public *;
}
Run Code Online (Sandbox Code Playgroud)

纵观源ReadOnly这是一个@interfacejava.lang.annotations.*进口@Documented,@RetentionPolicy.CLASS,@Target

proguard kotlin kotlin-reflect

14
推荐指数
2
解决办法
3973
查看次数

Kotlin反映了progSard SmallSortedMap

Warning: kotlin.reflect.jvm.internal.KClassImpl: can't find referenced class kotlin.reflect.jvm.internal.KClassImpl$kotlin.reflect.jvm.internal.KClassImpl$Data
Warning: kotlin.reflect.jvm.internal.KClassImpl: can't find referenced class kotlin.reflect.jvm.internal.KClassImpl$kotlin.reflect.jvm.internal.KClassImpl$Data
Warning: kotlin.reflect.jvm.internal.KClassImpl$data$1: can't find referenced class kotlin.reflect.jvm.internal.KClassImpl$kotlin.reflect.jvm.internal.KClassImpl$Data
Warning: kotlin.reflect.jvm.internal.KClassImpl$data$1: can't find referenced class kotlin.reflect.jvm.internal.KClassImpl$kotlin.reflect.jvm.internal.KClassImpl$Data
Warning: kotlin.reflect.jvm.internal.impl.protobuf.SmallSortedMap: can't find referenced class kotlin.reflect.jvm.internal.impl.protobuf.SmallSortedMap$kotlin.reflect.jvm.internal.impl.protobuf.SmallSortedMap$Entry
Warning: kotlin.reflect.jvm.internal.impl.protobuf.SmallSortedMap: can't find referenced class kotlin.reflect.jvm.internal.impl.protobuf.SmallSortedMap$kotlin.reflect.jvm.internal.impl.protobuf.SmallSortedMap$EntrySet
Warning: kotlin.reflect.jvm.internal.impl.protobuf.SmallSortedMap$Entry: can't find referenced class kotlin.reflect.jvm.internal.impl.protobuf.SmallSortedMap$kotlin.reflect.jvm.internal.impl.protobuf.SmallSortedMap$Entry
Warning: kotlin.reflect.jvm.internal.impl.protobuf.SmallSortedMap$Entry: can't find referenced class kotlin.reflect.jvm.internal.impl.protobuf.SmallSortedMap$kotlin.reflect.jvm.internal.impl.protobuf.SmallSortedMap$Entry
Run Code Online (Sandbox Code Playgroud)

我正在收到这些警告,这些警告会破坏我在任务上的发布transformClassesAndResourcesWithProguardForAppRelease.

我知道我可以忽略这些警告或通知proguard没有使用警告,-dontwarn但我想知道是否有其他人遇到这个并且实际上找到了正确的修复.

我正在使用Kotlin版本 1.1.4-2

proguard kotlin android-gradle-plugin kotlin-reflect

13
推荐指数
1
解决办法
681
查看次数

引用Kotlin类属性setter作为函数

在下面的示例中,t::x返回对属性getter的引用.如何为二传手获得同样的东西?

class Test(var x: String) {}

fun main(args: Array<String>) {
    val t = Test("A")

    val getter: () -> String = t::x
    println(getter()) // prints A

    val setter: (String) -> Unit = ????
}
Run Code Online (Sandbox Code Playgroud)

kotlin kotlin-reflect

10
推荐指数
3
解决办法
1109
查看次数

带有 Proguard 的 Kotlin 反射失败

假设我有这门课

data class Person(val name: String?)
Run Code Online (Sandbox Code Playgroud)

当我 proguard 并运行该应用程序时,出现以下异常

kotlin.reflect.jvm.internal.KotlinReflectionInternalError: No accessors or field is found for property val com.whatever.packagee.Person.name: kotlin.String?
Run Code Online (Sandbox Code Playgroud)

我还发现这个问题是从这个反射代码库中抛出的。任何帮助,将不胜感激

java proguard kotlin kotlin-reflect

9
推荐指数
1
解决办法
1941
查看次数

kotlin-reflect with proguard 会导致反射错误

我在 Spring Boot 应用程序代码中使用 ProGuard。升级到 Spring Boot 2 后,我无法再启动我的应用程序。

Spring Boot 2 使用 kotlin-reflect 创建 bean,它kotlin.Metadata在反射过程中使用注解。此注释具有未混淆的值,因此 kotlin-reflect 正在寻找具有原始名称的方法。并抛出以下异常:

kotlin.reflect.jvm.internal.KotlinReflectionInternalError: Could not compute caller for function: public constructor ProjectService(...

ProjectService被混淆为F,因此没有这样的构造函数。

当我保留类名时,我在其他地方也有同样的问题:

kotlin.reflect.jvm.internal.KotlinReflectionInternalError: Could not compute caller for function: public open fun addRole(...

有没有办法修复kotlin.Metadata注释参数的混淆?注释本身没有被混淆,它仍然引用写为字符串值的原始类名。我也试图混淆元数据注释无济于事。

proguard kotlin spring-boot kotlin-reflect

8
推荐指数
0
解决办法
958
查看次数

反射调用函数并使用默认参数

鉴于以下功能

fun function(x: Int = 12) {
    println("x = $x")
}
Run Code Online (Sandbox Code Playgroud)

如何使用反射调用它而不指定x(或以某种方式使用默认值,而不是硬编码)?

kotlin kotlin-reflect

6
推荐指数
1
解决办法
791
查看次数

(反思)隐含和明确的lambda声明

我试图理解反思.我有以下代码:

fun main(args: Array) {
println(lengthL1())
println(lengthL2(s))
println(lengthL1.get()) // Error
println(lengthL2.get(s)) // Error

println(lengthNL1.get())
println(lengthNL2.get(s))
println(lengthNL1())
println(lengthNL2(s))
}

val s = “1234”

val lengthL1: () -> Int = s::length
val lengthL2: (String) -> Int = String::length

val lengthNL1 = s::length
val lengthNL2 = String::length
Run Code Online (Sandbox Code Playgroud)

为什么我get在声明lambda时不能调用(参见错误注释)?有什么区别lengthL1lenghtNL1

lambda kotlin kotlin-reflect

6
推荐指数
1
解决办法
177
查看次数

Kotlin 中默认构造函数中的两种附加类型?

由于我一直在使用kotlin-reflect来调用我的默认值并声明了一个,因此我看到了第二个不同的构造函数。

我意识到两个不同的字段int arg3kotlin.jvm.internal.DefaultConstructorMarker arg4添加到我的构造函数中。

data class Model(
    @SerializedName("xyz") val entity: String?,
    @SerializedName("abc") val id: Long? = null
)
val constructors = clazz.declaredConstructors // how I call the constructors
Run Code Online (Sandbox Code Playgroud)

我的实际问题是为什么我有这两个字段以及它背后的逻辑是什么?

提前致谢。

android kotlin kotlin-reflect

6
推荐指数
1
解决办法
1006
查看次数

Kotlin 运行时错误 kotlin.Any 未找到

我有一个多模块项目。使用相同的构建,apk 的大小可能相差300KB (from 17 to 17.3MB). 在17MB运行时的构建中,我收到一个错误:

java.lang.AssertionError: Built-in class kotlin.Any is not found.
Run Code Online (Sandbox Code Playgroud)

同样在项目中,配置了混淆。但我不认为这是由这个引起的。Clean and Invalidate 和 Restart 并不总是有帮助。

android kotlin kotlin-reflect

6
推荐指数
1
解决办法
1232
查看次数

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

我有默认值的数据类。

data class Project(
    val code: String,
    val name: String,
    val categories: List<String> = emptyList())
Run Code Online (Sandbox Code Playgroud)

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

java.lang.IllegalArgumentException: Parameter specified as non-null is null: method Project.<init>, parameter categories
Run Code Online (Sandbox Code Playgroud)

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

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

reflection kotlin kotlin-reflect kotlin-null-safety

5
推荐指数
2
解决办法
1514
查看次数