java类加载器

转载 2007年10月11日 17:31:00

[按]由于课题中需要设计的一个接口引擎用到了Java的类加载器,所以转了此文。

[原文链接]http://www.builder.com.cn/2006/0707/240549.shtml

[相关文章]http://www.blogjava.net/realsmy/archive/2007/04/06/108889.html

                  http://www.ibm.com/developerworks/cn/java/j-dyn0203/

掌握Java类加载器

类加载器是Java最强大的特征之一。但是开发者常常忘记类加载组件。类加载器是在运行时负责寻找和加载类文件的类。Java允许使用不同的类加载器,甚至自定义的类加载器。

Java程序包含很多类文件,每一个都与单个Java类相对应,这些类文件不像静态C程序,一次性加载入内存,它们随时需要随时加载。这就是类加载器与众不同的地方。它从源文件(通常是.class .jar文件)获得不依赖平台的字节码,然后将它们加载到JVM内存空间,所以它们能被解释和执行。默认状态下,应用程序的每个类由java.lang.ClassLoader加载。因为它可以被继承,所以可以自由地加强其功能。

使用自定义类加载器的原因

  默认的java.lang.ClassLoader仅仅可以从加载本地文件系统的类。Java被设计成不论本地磁盘或网络都有足够的弹性加载类,并且可以在加载之前处理特殊事物。例如:应用程序可以检查Web站点或FTP上插入类的更新版本并且自动校验数字签名确保执行可信任的代码。许多众所周知的软件都使用自己的类加载器。

通常默认加载器是所谓的bootstrap类加载器;它负责加载诸如java.lang.Object等关键类和加载其他rt.jar文件的运行时代码到内存。因为Java语言规范没有提供bootstrap类加载器的详细信息,不同的JVM可能有不同的类加载器。如果看到网页上有applets在运行,则它使用的是自定义类加载器。嵌入到浏览器中的applet阅读器包含了可以访问远程服务器上站点的类加载器,它可以通过HTTP加载原始字节码文件,并且在JVM中将它们转换成类。

创建自己的类加载器

  类加载器(除了bootstrap类加载器)有父类加载器,这些父类是基本加载器的加载器实例。最重要的一点是设置正确的父加载器。然后可以使用类加载器的getParent()方法实现委派类请求(例如:自定义类加载器找不到使用专门方法的类时)。此时必须为将父加载器作为java.lang.ClassLoader构造器的参数:

public class MyClassLoader extends ClassLoader

{
public MyClassLoader()

{

super(MyClassLoader.class.getClassLoader());
}

}

loadClass(String name)方法是ClassLoader的入口。名字参数是完全资格类名(FQCN),例如关于包类名。如果父加载器设置正确,当请求MyClassLoader中的loadClass(String name)方法加载类,但又找不到需要加载的类时,则首先会询问父加载器。如果父加载器也找不到此类,则调用findClass(String name)方法。默认状态下findClass(String name)会抛出ClassNotFoundException例外,很多开发人员都很清楚这个例外。自定义类加载器的开发者都希望从java.lang.ClassLoader继承时跳过这个方法。

findClass()方法的目标是为MyClassLoader容纳所有专门代码,此时不需要重复其他代码(例如当加载失败时调用系统ClassLoader)。在此方法中,ClassLoader需要从原文件中获取字节码。一旦找到字节码则会调用defineClass()方法。ClassLoader实例调用此方法是非常重要的。因此,如果两个ClassLoader实例定义了来自不同或相同原文件的字节码,则被定义的类也将区别对待。

我们给出两个相似的类加载器MyClassLoader1 MyClassLoader2,它们都可以从相同的源文件找到MyCoolClass字节码。如果一个程序通过这两个加载器分别独立加载MyCoolClass实例(coolClass1通过MyClassLoader1加载, coolClass2通过MyClassLoader2加载),MyCoolClass.class能够被独立定义。执行下面的代码:

MyCoolClass coolClass1 = (MyCoolClass)coolClass2;

  将得到一个ClassCastException例外。(开发者如果没有很好的理解类加载机制则经常碰到这样的情况。)因为它们是不同的加载器所定义的,JVM将它们看成不同的类。虽然它们是相同类型的类并且从相同的源文件加载,但是变量coolClass1coolClass2不兼容。

不论是否跳过findClass() loadClass()getSystemClassLoader()方法将以实际ClassLoader对象的形式直接访问系统ClassLoader。也可以通过调用findSystemClass(String name)方法间接访问。getParent()方法允许获得父加载器。Listing A给出了可以运行的自定义类加载器示例。

总结

  如果对类加载机制有很好的理解,则可以从ClassNotFound ClassCastException错误调试工作中解脱出来。当软件在第三方软件服务器中工作时,因为app服务器经常使用私有而复杂的类加载器,此时对类加载机制的理解则非常重要。

Java高新技术第一篇:类加载器详解

首先来了解一下字节码和class文件的区别: 我们知道,新建一个java对象的时候,JVM要将这个对象对应的字节码加载到内存中,这个字节码的原始信息存放在classpath(就是我们新建Java工程...
  • jiangwei0910410003
  • jiangwei0910410003
  • 2014年01月01日 14:45
  • 24682

Java类加载器介绍

本文介绍类加载器概念,类加载器的分类,类加载器加载类的机制,最后实现一个自定义类加载器。...
  • yuxxz
  • yuxxz
  • 2016年05月09日 23:27
  • 3915

Java ----类加载器(自己写)

每一个技术,最好掌握以下底层的原理,这样才能得心应手
  • yangxin_blog
  • yangxin_blog
  • 2015年09月04日 22:34
  • 903

深入理解Java类加载器(ClassLoader)

【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/73413292 出自【...
  • javazejian
  • javazejian
  • 2017年06月26日 09:34
  • 13103

Java类加载器与反射

一个命令对应一个进程 当我们启动一个Java程序,即启动一个main方法时,都将启动一个Java虚拟机进程,不管这个进程有多么复杂。而不同的JVM进程之间是不会相互影响的。这也就是为什么说,Java程...
  • rusbme
  • rusbme
  • 2016年05月03日 15:16
  • 1493

深入理解Java类加载器(1):Java类加载原理解析

1       基本信息 每个java开发人员对java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这背后就涉及到了java技术体系中的类加载。Java的类加载...
  • zhoudaxia
  • zhoudaxia
  • 2014年07月06日 19:08
  • 42677

JAVA类加载机制以及如何自定义类加载器

原文链接:http://xtuhcy.iteye.com/blog/2305410 从双亲委派说起 启动(Bootstrap)类加载器:是用本地代码实现的类装入器,它负责将 /lib下面的...
  • chen88358323
  • chen88358323
  • 2016年06月21日 16:13
  • 1951

Java类加载器(自定义类加载器)

为什么要有类加载器 类加载的过程 初识类加载器 类加载机制 自定义类加载器 为什么要有类加载器我们知道java中所有的二进制文件,最后都是要放在jvm中解释运行的。纯粹的二进制文件,其实并没有什么卵用...
  • luochoudan
  • luochoudan
  • 2016年03月03日 15:42
  • 1704

java--加强之 类加载器,动态代理

类加载器的升入讲解及应用
  • u010163442
  • u010163442
  • 2013年08月13日 11:16
  • 1165

java学习之深入类加载器--ClassLoader

1.类加载器的原理 2.类加载器树状结构,双亲委托(代理)机制 3.自定义类加载器(文件,网络,加密) 4.线程上下文类加载器 5.服务器类加载原理和OSGI介绍 一、类加载器的作用 将class文...
  • haitaofeiyang
  • haitaofeiyang
  • 2015年03月15日 21:19
  • 1897
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java类加载器
举报原因:
原因补充:

(最多只允许输入30个字)