posts - 88, comments - 3, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

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

Posted on 2016-03-16 15:40 Milo的海域 阅读(311) 评论(0)  编辑  收藏 所属分类: 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实例。

只有注册用户登录后才能发表评论。


网站导航: