在搜索加载Jar文件时,满屏都是URLClassLoader,简直是被玩坏了。作为不求甚解的人,都觉得太过不去了,看看源码吧。
URLClassLoader的最终基类是ClassLoader。
- 支持并发的ClassLoader需要在初始化时,调用
registerAsParallelCapable()
注册自己 - 对于由ClassLoaderA读入的class中使用的其他class,JVM仍然使用
ClassLoaderA.loadClass()
解析 Collections.newSetFromMap()
创建一个以Map为数据存储的Set,Map是<E, Boolean>
的- 一个风骚的方法排布方式
ClassLoader(Void unused, ClassLoader parent);
....
this(checkCreateClassLoader(), getSystemClassLoader()); - 不鼓励重载
loadClass()
,鼓励重载findClass(String)
- 包名不允许java开头
- 包中的所有类的certs(目测是签名的公钥之类的东西)需要和本包中第一个被load的class相同
resolveClass
相当于GCC的link,解析与该类相关的其他符号
URLClassLoader的直接父类是SecureClassLoader,仅仅是做了一个ProtectionPermission的Cache。
再加一下Proxy的大概实现原理:根据所有的interface,动态生成字节码,写到ByteArrayOutputStream中(模拟一个class文件)。对于JVM来讲,Proxy与非Proxy的class是无差别的。
下面是URLClassLoader,没什么特别的。FUCK!!!看了一下午啊!!!啊啊啊!!!结论是,load本地jar包用URLClassLoader就好了,人家已经把文件考虑在内了,啊啊啊!!!
对于Dalvik,文件的ClassLoader是现成的。