例如,如果我使用
methodReference = ::method
而不是
methodReference = { method(it) }
由于反射,反编译的代码将在Java代码中包含getowner,getname,getSignature方法.这些方法是否计入64k限制?
解决方法:
仅当proguard / R8未删除这些方法时,这些方法才计算在内
一个例子
fun method(t : Any) {} val reference1: KFunction1<Any, Unit> = ::method val reference2: (Any) -> Unit = { method(it) }
对于reference1,字节码(反编译为Java)为:
@NotNull final KFunction reference1 = new Function1((X)this) { // $FF: synthetic method // $FF: brIDge method public Object invoke(Object var1) {.. } public final voID invoke(@NotNull Object p1) {..} public final KDeclarationContainer getowner() {..} public final String getname() {..} public final String getSignature() {..} };
对于lambda(或reference2),等效的Java代码为:
@NotNull final Function1 reference2 = (Function1)(new Function1() { // $FF: synthetic method // $FF: brIDge method public Object invoke(Object var1) {..} public final voID invoke(@NotNull Object it) {..} });
因此,方法引用的区别是4 1,lambda的区别是1 1,其中1来自桥接方法invoke(t:Any)
总结以上是内存溢出为你收集整理的java-Kotlin生成的字节码是否会影响方法计数?全部内容,希望文章能够帮你解决java-Kotlin生成的字节码是否会影响方法计数?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)