关于java默认的类加载器的简单代码研究

1. 默认的3个classloader: BootstrapClassloader (Native实现), ExtClassloader, AppClassloader (Java实现)
2. 3个加载器并不是真正的父子继承关系,而是逻辑上的,JVM启动先创建ExtClassloader instance,然后构造AppClassloader的时候传入ExtClassloader实例作为parent
        Launcher.ExtClassLoader extcl;
        
try  {
            extcl 
=  Launcher.ExtClassLoader.getExtClassLoader();
        } 
catch  (IOException var10) {
            
throw   new  InternalError( " Could not create extension class loader " , var10);
        }

        
try  {
            
this .loader  =  Launcher.AppClassLoader.getAppClassLoader(extcl);
        } 
catch  (IOException var9) {
            
throw   new  InternalError( " Could not create application class loader " , var9);
        }

关于双亲委派原理: 在加载类的时候,会看看parent有没有设定,如果设定了 就调用parent.loadClass方法,如果没设定(==null)也就是parent应该是BootstrapClassloader, 会调用native的findBootstrapClass来加载类,代码:
                 try  {
                    
if ( this .parent  !=   null ) {
                        c 
=   this .parent.loadClass(name,  false );
                    } 
else  {
                        c 
=   this .findBootstrapClassOrNull(name);
                    }
                } 
catch  (ClassNotFoundException var10) {
                    ;
                }

目的是按照一定优先级别装载系统的lib,系统ext目录的lib,以及classpath的lib,防止系统的默认行为或者类的实现被修改。

3. java 类的动态加载
Java内置的ClassLoader总会在加载一个Class之前检查这个Class是否已经被加载过,已经被加载过的Class不会加载第二次。因此要想重新加载Class,我们需要实现自己的ClassLoader。
另外一个问题是,每个被加载的Class都需要被链接(link),这是通过执行ClassLoader.resolve()来实现的,这个方法是 final的,因此无法重写。Resove()方法不允许一个ClassLoader实例link一个Class两次,因此,当你需要重新加载一个 Class的时候,你需要重新New一个你自己的ClassLoader实例。

你可能感兴趣的:(关于java默认的类加载器的简单代码研究)