4

我在 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确实加载FooFoo2

于是上课解决了。

奇怪的是,这几乎是第二个问题,但如果我添加M extends Application, thenM根本没有解决,即使在实例化它时也是如此。Foo并且仅在被调用Foo2时才加载到 JVM中,(在is时加载,for )。m(X)FooX"0"Foo2X="1"

这里有没有人对这些潜在问题有合理的解释:

  • 为什么M解决了,类不应该解决。即使实例化M也不应该加载Fooat least Foo2.
  • 为什么扩展类的Application行为不同?
  • 是否有其他以不同方式运行的 Android 类?
4

0 回答 0