我在 Android 上观察到很多行为(我正在处理一个 multidex 问题,所以我在 4.4.4 中使用了一个模拟器),这让我对 Android 类加载无言以对:
在 Android上,类加载器加载时不应该解析类。但是如果我创建一个类:
public class M {
public Foo m(String i) {
switch (i) {
case "0":
return new Foo();
case "1":
return new Foo2();
}
return null;
}
}
并调试我的应用程序,添加手表:
getClass().getClassLoader().findLoadedClass("Foo")
getClass().getClassLoader().findLoadedClass("Foo2")
然后我可以看到加载M
确实加载Foo
了Foo2
!
于是上课就解决了。
奇怪的是,这几乎是第二个问题,但如果我添加M extends Application
, thenM
根本没有解决,即使在实例化它时也是如此。Foo
并且仅在被调用Foo2
时才加载到 JVM中,(在is时加载,for )。m(X)
Foo
X
"0"
Foo2
X="1"
这里有没有人对这些潜在问题有合理的解释:
- 为什么
M
解决了,类不应该解决。即使实例化M
也不应该加载Foo
或at least Foo2
. - 为什么扩展类的
Application
行为不同? - 是否有其他以不同方式运行的 Android 类?