美文网首页
Java - 类加载机制

Java - 类加载机制

作者: sunboximeng | 来源:发表于2018-06-18 21:34 被阅读9次
Loading.jpg

JVM启动的时候,并不会一次性加载所有的class文件,而是根据需要去动态加载。ClassLoader的具体作用就是将class文件加载到jvm虚拟机中去。此外,它也可以加载其他的资源,比如配置文件、图片等等。
所以他和FileReader很像,只不过返回值不一样。

获得ClassLoader的几种方法
  • this.getClass.getClassLoader(); // 使用当前类的ClassLoader
  • Thread.currentThread().getContextClassLoader(); // 使用当前线程的ClassLoader
  • ClassLoader.getSystemClassLoader(); // 使用系统ClassLoader,即系统的入口点所使用的ClassLoader。
用ClassLoader载入资源的几种方法
  • 类的载入方式

    1. 使用Class静态方法 Class.forName
    Class cls = Class.forName("com.alexia.B");  
    B b = (B)cls.newInstance();
    
    1. 使用 ClassLoader
    /* Step 1. Get ClassLoader */  
    ClassLoader cl = this.getClass.getClassLoader();;  // 如何获得ClassLoader参考1  
    
    /* Step 2. Load the class */  
    Class cls = cl.loadClass("com.alexia.B"); // 使用第一步得到的ClassLoader来载入B  
       
    /* Step 3. new instance */  
    B b = (B)cls.newInstance(); // 有B的类得到一个B的实例  
    
    1. 直接 new
    B b = new B(); 
    
  • 文件的载入方式(例如配置文件等)
    假设想读取文件夹 /com/alexia/config 里的文件sys.properties文件

    1. 直接用IO流读取
      如果是属性配置文件,也可以通过java.util.Properties.load(is)将内容读到Properties里。
    File f = new File("C:/test/com/aleixa/config/sys.properties"); // 使用绝对路径 
    InputStream is = new FileInputStream(f); 
    
    1. 使用ClassLoader
    InputStream is = null;  
    is = this.getClass().getClassLoader().getResourceAsStream(  
         "com/alexia/config/sys.properties"); //方法1  
    //is = Thread.currentThread().getContextClassLoader().getResourceAsStream(  
         "com/alexia/config/sys.properties"); //方法2  
    //is = ClassLoader.getSystemResourceAsStream(
         "com/alexia/config/sys.properties"); //方法3 
    
    1. 使用ResourceBundle
  • Web资源的载入方式
    在web应用里当然也可以使用ClassLoader来载入资源,但更常用的情况是使用ServletContext.getResource()

我们编写的java程序是如何运行的,我们自己编写的各种类是如何被加载到jvm(java虚拟机)中去的?

参考资料:
Java中用ClassLoader载入各种资源(类、文件、web资源)的方法
一看你就懂,超详细java中的ClassLoader详解

相关文章

网友评论

      本文标题:Java - 类加载机制

      本文链接:https://www.haomeiwen.com/subject/yaxoeftx.html