ClassLoader功能说明

乔欣 Java教程 发布时间:2022-12-02 16:20:01 阅读数:4791 1
下文笔者将讲述ClassLoader的功能详解,如下所示

ClassLoader详解

 
ClassLoader的简介:
    对类请求提供服务
    当JVM需要某类时
    它使用类的全限定名向ClassLoader索取类
     ClassLoader将返回,这个类class对象

ClassLoader功能

 
ClassLoader的功能:
   载入系统中所有Resources(Class,文件,来自网络的字节流等)
   使用ClassLoader这个类可将资源载入到JVM中
 
   我们都知道每个class都有一个reference
   指向自己的ClassLoader

   例:
    Class.getClassLoader()

注意事项:
   1.数组的ClassLoader是其元素的ClassLoader
   2.如果是基本数据类型数组,则这个数组没有ClassLoader

Class.getClassLoader()的工作原理

自JDK1.2以后
 ClassLoader在进行类加载时,使用双亲委派模式,如下所示:
   ClassLoader在载入类库时先让Parent寻找,Parent找不到才自己找
   ClassLoader指以下三种:
	   Bootstrap ClassLoader、Extension ClassLoader和 App ClassLoader
 
 三个Loader简介:	   
   Bootstrap ClassLoader: 
       native方法,使用C++编写,在Java中看不到它,是null
       用于加载核心类库(lib中的类库)

   Extension ClassLoader:加载lib/ext中的类库

   App ClassLoader:加载Classpath中的类库

 三者对应的层级关系
    App ClassLoader的Parent是Extension ClassLoader
    Extension ClassLoader的Parent为Bootstrap ClassLoader。

Class.getClassLoader()加载类的原理

当JVM需加载一个类时,
   首先由BootStrap进行寻找
   找不到再由Extension ClassLoader寻找
   最后由App ClassLoader查找
   
Tomcat的ClassLoader结构图:  
               Bootstrap 
                  | 
                System 
                  | 
                Common 
                /     
            Catalina  Shared 
                      /     
                   Webapp1  Webapp2 ... 

线程中ClassLoader简介

每个线程中都有一个contextClassLoader
contextClassLoader的功能:
    用于动态的载入其它类
如:
  Thread.currentThread().setContextClassLoader(...);
  Thread.currentThread().getContextClassLoader()
 
  this.getClass.getClassLoader();
  //得到Classloader是静态的,表明类的载入者是谁;

  Thread.currentThread().getContextClassLoader();  
  //得到Classloader是动态,
   执行者Classloader 

tomcat中ClassLoader

Tomcat中
  WebApp的ClassLoader的工作原理与java中有小小不同
  它先试图自己载入类(在ContextPath/WEB-INF/...中载入类)
    当无法载入时,再请求父ClassLoader完成  
Tomcat中
   WEB APP线程的contextClassLoader是WebAppClassLoader  
   Tomcat Server线程的contextClassLoader是CatalinaClassLoader  

获得ClassLoader的几种方法

java中我们有以下三种获取ClassLoader的方法  
   this.getClass.getClassLoader(); // 使用当前类的ClassLoader  
   Thread.currentThread().getContextClassLoader(); // 使用当前线程的ClassLoader  
   ClassLoader.getSystemClassLoader(); // 使用系统ClassLoader,即系统的入口点所使用的ClassLoader。
     (system ClassLoader与根ClassLoader有些区别
      如:JVM下system ClassLoader通常为App ClassLoader)  

资源载入

java中所有资源
  可使用ClassLoader载入到JVM里
例:
类载入
1. 使用Class静态方法Class.forName
    Class cls = Class.forName("com.java265.test"); 
    T t = (T)cls.newInstance();
	
2. 使用ClassLoader  
    ClassLoader cl; // 如何获得ClassLoader参考1.6 
    Class cls = cl.loadClass("com.java265.test"); // 使用第一步得到的ClassLoader来载入B 
    T t = (T)cls.newInstance(); // 有B的类得到一个B的实例 

3. 直接new  
    T t = new T(); 

文件载入(如配置文件)

如果com.java265.Test类中
需要读取文件夹 /com/Java/config中的文件 application.properties
我们可以使用IO的模式读取
如: 
  直接IO  
File f = new File("D:/test/com/java265/config/application.properties"); // 使用绝对路径 
//File f = new File("com/java265/config/application.properties"); // 使用相对路径 
InputStream is = new FileInputStream(f); 
  
  注意事项:
     我们可使用java.util.Properties.load(is)
	  将内容读到Properties里
      但是Properties的默认编码是ISO-8859-1


方法2:
   使用ClassLoader读取文件 
InputStream is = null; 
is = this.getClass().getClassLoader().getResourceAsStream( 
       "com/java265/config/application.properties");   
is = Thread.currentThread().getContextClassLoader().getResourceAsStream( 
       "com/java265/config/application.properties");  
is = ClassLoader.getSystemResourceAsStream("com/java265/config/application.properties"); 

3.使用ResourceBundle
  ResourceBundle bundle = ResourceBundle.getBoundle("com.java265.config.application"); 
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaCourse/202212/5000.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者