Java Dynamic ClassLoading (II. diff)

如果不在构造函数中特别指定parent,用户自定义的类加载器的parent都是system classloader,可以通过getParent( ) 方法获取。

1.  Class.forName( name ) 

     public   static  Class <?>  forName(String className) 
                
throws  ClassNotFoundException  {
        
return forName0(className, true, ClassLoader.getCallerClassLoader());
    }

 

/** Called after security checks have been made. */
    
private   static   native  Class forName0(String name,  boolean  initialize,
                        ClassLoader loader)
    
throws  ClassNotFoundException;

 

     static  ClassLoader getCallerClassLoader()  {
        
// NOTE use of more generic Reflection.getCallerClass()
        Class caller = Reflection.getCallerClass(3);
        
// This can be null if the VM is requesting it
        if (caller == null{
            
return null;
        }

        
// Circumvent security check since this is package-private
        return caller.getClassLoader0();
    }

 

Class.forName是使用调用者的类加载器来加载指定类的。也可以在另外一种形式的调用中指定类加载器。

2.  ClassLoader.loadClass( name )

 使用指定的类加载器加载类,与调用者的类加载器无关。

3.  Thread.currentThread().getContextClassLoader() 

获取当前线程上下文的ClassLoader,如果在线程创建后,不做任何设置,当前线程上下文的ClassLoader就是System ClassLoader。在线程创建后,可以设置使用自定义的类加载器。

与Class.forName很相似,不过,如果线程创建者的加载器与当前线程上下文的ClassLoader不一样时,两者是有区别的。当前线程上下文的ClassLoader在编写框架类软件时好用,而Class.forName在编写业务逻辑时就足够了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值