Android类解析中的陌生事物

我在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 ,那么M根本就不会被解析,即使实例化它也是如此。 当调用m(X)时, FooFoo2仅被加载到JVM中m(X)X"0"时加载Foo ,对于X="1"加载Foo2 )。

这里有没有人对这些基本问题有合理的解释:

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