我们发现,Android中自定义一个java.lang.Object类会怎么样?可以编译成功吗?
答案是可以的。
我很震惊。
为什么不会有问题呢?
这就回到ClassLoader的双亲委托机制,详细请参看文章https://blog.csdn.net/weixin_43662090/article/details/113626287,不再重复啰嗦
所以,Android最终会委托到ClassLoader中进行加载,这时会发现,ClassLoader中加载过了,所以不会重新进行加载。
就算这个时候没有加载过,ClassLoader也会从系统目录下找到java.lang.Object类进行加载。
所以子ClassLoader就没有机会加载ClassLoader了
附上ClassLoader的loadClass源码
@Override
protected Class<?> loadClass( final String class_name, final boolean resolve ) throws ClassNotFoundException {
Class<?> cl = null;
/* First try: lookup hash table.
*/
if ((cl = classes.get(class_name)) == null) {
/* Second try: Load system class using system class loader. You better
* don't mess around with them.
*/
for (final String ignored_package : ignored_packages) {
if (class_name.startsWith(ignored_package)) {
cl = getParent().loadClass(class_name);
break;
}
}
if (cl == null) {
JavaClass clazz = null;
/* Third try: Special request?
*/
if (class_name.contains(BCEL_TOKEN)) {
clazz = createClass(class_name);
} else { // Fourth try: Load classes via repository
if ((clazz = repository.loadClass(class_name)) != null) {
clazz = modifyClass(clazz);
} else {
throw new ClassNotFoundException(class_name);
}
}
if (clazz != null) {
final byte[] bytes = clazz.getBytes();
cl = defineClass(class_name, bytes, 0, bytes.length);
} else {
cl = Class.forName(class_name);
}
}
if (resolve) {
resolveClass(cl);
}
}
classes.put(class_name, cl);
return cl;
}