删掉final的区别是啥啊

来源:9-3 VirtualApk 如何实现插件化?

qq_lee_3

2019-09-22

我看Java虚拟机216页,不加final,类加载的准备阶段过后,初始值为0,不会赋值,只会在类初始化的时候赋值
加上final,在准备阶段就会直接赋值

我有点一知半解,还是不理解,运行时R.id.always为啥不用自己的,在前ClassLoader只会加载宿主的R类吗?那好像也不太对,没想明白

写回答

1回答

bennyhuo

2019-09-22

两个问题。

  1. 对于一个整型来讲,加 final 之后,所有引用这个变量的地方都会编译时替换成值,而不是变量(或者说常量)本身。

  2. 插件化通常的做法是把插件的 ClassLoader 的父 ClassLoader 设置为宿主的 ClassLoader,双亲委派机制,所以如果宿主存在跟插件一样的类,会优先加载宿主的,插件的那个类就会被忽略。

明白了这两个点之后,插件因为不知道宿主的 id 的值,因此通过 1 来保持对变量的引用(而不是替换成插件的id的值),通过 2 来在运行时加载到正确的 id 的值。

1
0

大厂资深面试官 带你破解Android高级面试

改变视野和思维 深度与广度兼备的 Android 进阶面试指导课程

1636 学习 · 222 问题

查看课程