Tag: inline

为什么`Intrinsics.checkParameterIsNotNull`没有内联?

在Kotlin中,如果我们将一些Kotlin字节码反编译为Java,我们经常可以看到这样的语句: Intrinsics.checkParameterIsNotNull(foo, “foo”) 如果我们继续探索,我们可以看到这个方法的反编译实现,它的实现和它的名字完全一样: public static void checkParameterIsNotNull(Object value, String paramName) { if (value == null) { throwParameterIsNullException(paramName); } } 由于这个类( Intrinsics )的存在,我不能使用没有stdlib的Kotlin,即使我尽我所能避免使用stdlib中的函数,它也会自动生成对Intrinsics.checkParameterIsNotNull调用。 由于这个方法的实现非常短(而且很常见),为什么这个函数没有内联呢? 有没有一些注释可以让我们阻止Kotlin编译器生成这个空检查? (也许像@TrustedNotNull ) 对于ProGuard:我很担心,因为我正在使用共享库,在这种情况下ProGuard不适合我。 我显然知道那些代码清除工具(ProGuard,dce-js),我知道如何以及何时使用它们。 我只是问为什么是一个函数不内联。

Kotlin内联扩展属性

我知道内联关键字的意思是避免调用开销调用一个函数。 但我不明白什么内联扩展属性工作? 假设我们有两个名为foo的扩展属性,另一个是内联的命名条 val Any.foo : Long get() = Date().time inline val Any.bar : Long get() = Date().time 执行它们中的任何一个,我们find期望的输出,即当前时间。 这个文件的字节码如下: public final class InlinedExtensionPropertyKt { public final static getFoo(Ljava/lang/Object;)J @Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 0 L0 ALOAD 0 LDC “$receiver” INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull (Ljava/lang/Object;Ljava/lang/String;)V L1 LINENUMBER 9 L1 NEW java/util/Date DUP INVOKESPECIAL java/util/Date. ()V INVOKEVIRTUAL java/util/Date.getTime ()J […]

从Java调用Kotlin内联函数

Exceptions.kt: @Suppress("NOTHING_TO_INLINE") inline fun generateStyleNotCorrectException(key: String, value: String) = AOPException(key + " = " + value) 在kotlin: fun inKotlin(key: String, value: String) { throw generateStyleNotCorrectException(key, value) } 它在kotlin中运行,并且函数被内联。 但是在Java代码中使用时,它不能被内联,并且仍然是一个正常的静态方法调用(从反编译的内容中看到)。 像这样的东西: public static final void inJava(String key, String value) throws AOPException { throw ExceptionsKt.generateStyleNotCorrectException(key, value); // when decompiled, it has the same contents as before , […]