寻找一些将职业选手放入项目的人的帮助.
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这是一个@interface与java.lang.annotations.*进口@Documented,@RetentionPolicy.CLASS,@Target
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
在下面的示例中,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) 假设我有这门课
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)
我还发现这个问题是从这个反射代码库中抛出的。任何帮助,将不胜感激
我在 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注释参数的混淆?注释本身没有被混淆,它仍然引用写为字符串值的原始类名。我也试图混淆元数据注释无济于事。
鉴于以下功能
fun function(x: Int = 12) {
println("x = $x")
}
Run Code Online (Sandbox Code Playgroud)
如何使用反射调用它而不指定x(或以某种方式使用默认值,而不是硬编码)?
我试图理解反思.我有以下代码:
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时不能调用(参见错误注释)?有什么区别lengthL1和lenghtNL1?
由于我一直在使用kotlin-reflect来调用我的默认值并声明了一个,因此我看到了第二个不同的构造函数。
我意识到两个不同的字段int arg3和kotlin.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)
我的实际问题是为什么我有这两个字段以及它背后的逻辑是什么?
提前致谢。
我有一个多模块项目。使用相同的构建,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 并不总是有帮助。
我有默认值的数据类。
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 中实现这一目标?
kotlin ×10
kotlin-reflect ×10
proguard ×4
android ×2
java ×1
lambda ×1
reflection ×1
spring-boot ×1