JVM装载类(ClassLoader)

    java是动态性的解释型语言,动态性是指,JVM不是一次性加载所有类,首先加载必需的基础类,然后随着程序的运行动态加载所需的类。

 

1.ClassLoader加载的流程

      

       如上图所示,为JVM运行的三个类加载器。

       Bootstrap ClassLoader:这个类加载器除了根据系统参数做些初始化的操作外,还负责创建ExtClassLoader和AppClassLoader。System.getProperty("java.boot.class.path")可以获得该加载器的加载路径。

       ExtClassLoader:负责加载JAVA_HOME/jre/lib/ext包下的扩展类,该加载器无父类加载器 System.getProperty("java.ext.dirs")获得该加载器的加载路径。

      AppClassLoader:应用程序加载类,父类加载器是ExtClassLoader,负责加载ClassPath路径的类。System.getProperty("java.class.path")获得该加载器的加载路径。

2.父类委托模式

    a.在加载类时,会先委托给父类加载器(如ExtClassLoader是AppClassLoader的父类加载器)加载,一直递推至父类为null的加载器,如果不能加载则使用子类加载器加载。

此模式保证类的安全,如当使用java.lang.String类时,使用的一定是ExtClassLoader加载的String类。

    b.一个加载器不能加载同一个类两次,否则会报LinkageError错误

    c.JVM通过类文件名及类的加载器唯一标识一个类,因此不同加载器加载的同一个.class文件是不同的。

3.类的加载

    a.隐式加载,当程序在new一个类的实例时,JVM按照父类委托模式,自动加载类。

    b.显示加载,在代码中明确地申明类加载及指定类加载器。如在JDBC操作中,加载驱动类:Class.forName(“jdbc driver name”);

      

//显示加载类,并创建实例
Class c = ClassLoader.loaderClass("cn.com.test.Test");
Test t = (Test)c.newInstance();
//指定类加载器
ClassLoader cl = this.getClass.getClassLoader();
cl.loaderClass("cn.com.test.Test");
//使用URL文件路径加载类
URLClassLoader ucl  = new URLClassLoader(new URL("url"));
ucl.loadClass("cn.com.test.Test");

3.常见方法

findClass():返回查找到的类,需要在类加载器的实现中重写该方法。在获得类数据后,使用defineClass()方法返回类。

4.类加载器与程序的热部署

      热部署,即是在不重启应用服务器的前提下,更新应用程序。在企业系统中,实际的生产环境要求7*24小时运行,不能随便重启,因此热部署在实际应用中很重要。

      ClassNotFoundException:应用程序的类加载器无法在程序目录下,找到所需的类。

      ClassCastException:在父类转换为子类,及在不同的加载器加载的类之间转换时发生。

     现在的应用服务器(如Weblogic、tomcat、Jboss)等都支持Servlet和JSP文件的热部署,这点可以通过配置文件、参数的修改实现。但是要热部署第三方Jar包(Struts2、ibatis)和EJB组件及其他,则需要通过编写自己的类加载器来实现。

自定义的ClassLoader类:

public class MyClassLoader extends ClassLoader {
 
 public Class<?> findClass(String name) throws ClassNotFoundException{
  byte[] b = loadClassData(name);
  return defineClass(null, b, 0, b.length);
 }
 
 private byte[] loadClassData(String name){
  //根据类路径读取类文件数据
  return null;
 }
}

采用监听机制监听类的改变,在类改变时,新建类加载器加载所需的应用程序的类。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值