zoukankan      html  css  js  c++  java
  • 类加载器

    类加载器

    1、介绍

    类加载器,加载类到JVM中。主要做的寻找类,通过将完整类名映射成相应的目录,按照目录进行搜索。尝试使用当前的类加载器,如果加载不到,再使用父加载器加载,否则再向上找。

    类加载过程是使用当前类的类加载加载指定的类的,如果加载不到,再使用上级类加载器进行加载。

    2、java ClassLoader

    java类加载时三级类加载机制,分别是:

    • Bootstrap

      加载jdk的核心类,即java.lang包下的类,该类无法在程序中获得,返回的始终是null。

      //loader为null,jdk下的类加载是Bootstrap类加载。
      ClassLoader loader = Integer.class.getClassLoader();
      System.out.println(loader) ;
      

    • ExtClassLoader

      扩展类加载器,加载jre/lib/*.jar中的类,父加载器是BootstrapClassLoader。

      //ExtClaassLoader,
      ClassLoader loader = javax.jnlp.BasicService.class.getClassLoader();
      System.out.println(loader) ;
      

    • AppClassLoader

      加载自定义的第三方类,ExtClassLoader是父加载器。

      //AppClassLoader,自定义的类使用AppClassLoader
      ClassLoader loader = Hello.class.getClassLoader();
      System.out.println(loader) ;
      

    3、自定义类加载器

    自定义类加载器是从特定的方式读取字节码文件后,形成字节数组,在通过defineClass方法恢复成类即可。使用时创建自己的ClassLoader对象,调用器loadClass方法。代码如下:

    package com.oldboy.java.jvm;
    
    import java.io.ByteArrayOutputStream;
    import java.io.FileInputStream;
    
    /**
     * 自定义类加载
     */
    public class MyClassLoader extends ClassLoader{
      protected Class<?> findClass(String name) throws ClassNotFoundException {
        try {
          //指定加载的特定路径
          String path = "d:\java\" + name + ".class" ;
          FileInputStream fis = new FileInputStream(path) ;
          ByteArrayOutputStream baos = new ByteArrayOutputStream() ;
          byte[] buf = new byte[1024] ;
          int len = -1 ;
          while((len = fis.read(buf)) != -1){
            baos.write(buf , 0 , len);
          }
          baos.close();
          fis.close();
          byte[] data = baos.toByteArray();
          Class clz = defineClass(data , 0 , data.length) ;
          return clz ;
        } catch (Exception e) {
          e.printStackTrace();
        }
        return null ;
      }
    }
    

    调用自定义的类加载器,加载指定的类:

    /**
     * 
     */
    public static void main(String[] args) throws Exception {
      ClassLoader loader = new MyClassLoader();
      //加载自己的类
      Class clz = loader.loadClass("Hello") ;
      IByeService bs = (IByeService) clz.newInstance();
      bs.sayBye("tomtomt");
    }
    

    4、类加载过程

    类加载时会加载用到的所有的类,类的静态代码块是类加载期间的初始化工作,可以关闭在类加载期间进行初始化。通过Class.forName(String String ,boolean init , ClassLoader loader)进行控制。

  • 相关阅读:
    Leetcode 121. Best Time to Buy and Sell Stock
    Leetcode 120. Triangle
    Leetcode 26. Remove Duplicates from Sorted Array
    Leetcode 767. Reorganize String
    Leetcode 6. ZigZag Conversion
    KMP HDU 1686 Oulipo
    多重背包 HDU 2844 Coins
    Line belt 三分嵌套
    三分板子 zoj 3203
    二分板子 poj 3122 pie
  • 原文地址:https://www.cnblogs.com/xupccc/p/9655333.html
Copyright © 2011-2022 走看看