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)进行控制。

  • 相关阅读:
    2013-10-31 《问题儿童居然一天两更!?》
    2013-10-31 《October 31st, 2013》
    2013-10-31 《三天里什么都没干……总之把目前为止的代码发了吧……》
    日怎么没人告诉我这博客可以改博文界面的显示宽度的
    俗话说打脸哦不打铁要趁热所以记录下替换图片的方法
    GUI好看码难写不是难写是难看我是说码难看不是GUI
    虽然保持了连续代码生产量但是仔细想想也没什么必要
    重写了电话本代码全面更新居然连续三天每天一个程序
    专注写字典三十年问你怕未又被编码卡了简直难以置信
    我就写个字典居然卡了两天重申一遍文字编码日你大爷
  • 原文地址:https://www.cnblogs.com/xupccc/p/9655333.html
Copyright © 2011-2022 走看看