首页 > 编程语言 > 详细

JAVA基础_类加载器

时间:2017-09-11 00:26:39      阅读:362      评论:0      收藏:0      [点我收藏+]

什么是类加载器

  • 类加载器是Java语言在1.0版本就引入的。最初是为了满足JavaApplet需要。现在类加载器在Web容器和OSGI中得到了广泛的应用,一般来说,Java应用的开发人员不需要直接同类加载器进行交互。Java虚拟机默认的行为就已经足够满足大多数情况的需求了。不过如果遇到了需要与类加载器进行交互的情况,而对类加载器的机制又不是很了解的话,就很容易花大量的时候在ClassNotFoundException和NoClassDefFoundError等异常上。
  • 顾名思义,类加载器是用来加载Java类到Java虚拟机中。一般来说,Java虚拟机使用Java类的方式如下:Java源程序(.java文件)在经过Java编译器编译之后会被转换成Java字节码代码(.class文件)。类加载器负责读取Java字节代码,并转换成java.lang.Class类的一个实例。每个这样的实例用来表示一个Java类。通过此实例的newInstance()方法就可以创建出该类的一个对象。实际的情况可能更复杂,比如Java字节码可能是通过工具动态生成的,也可能是通过网络下载的。基本上所有的类加载器都是java.lang.ClassLoader类的一个实例。

ClassLoader类介绍

java.lang.ClassLoader类的基本职责就是根据一个指定的类的名称,找到或者生成其对应的字节代码,然后从这些字节代码中定义出一个Java类,即Java.lang.Class类的一个实例,除此之外,ClassLoader还负责加载Java应用所需要的资源,如图像文件和配置文件。为了完成加载类这个职责,ClassLoader提供了一系列的方法。

表1:ClassLoader中与加载类相关的方法

方法 说明
getParent() 返回该类的父类加载器
loadClass(String name) 加载名称为name的类,返回的结果是java.lang.Class类的实例
findClass(String name)查找名称为name的类,返回的结果是java.lang.Class类的实例
findLoadedClass(String name) 查找名称为name的已经被加载过的类,返回的结果是java.lang.Class的实例
defineClass(String name,byte[] b,int off,int len)把字节数组b中的内容转换成java类,返回的结果是java.lang.Class的实例。这个方法被声明为final的
resolveClass(Class<?> c)链接制定的Java类

在表1中给出的方法,表示类名称的name参数的值是类的二进制名称。需要注意的是内部类的表示,如:com.exampe.Husband$Wife和com.example.OutClass$InnerClass等表示形式。

类加载器的树状组织结构

Java中的类加载器大致可以分为两类,一类是系统提供的,另外一类是Java应用开发人员自己编写的。系统提供的主要有以下三种:

  • 引导类加载器(bootstrap class loader):它用来加载Java的核心库,是用原生代码来实现的,并不集成自java.lang.ClassLoader。
  • 扩展类加载器(extensions class loader):它用来加载Java的扩展库。Java虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载Java类。
  • 系统类加载器(system class loader):他根据Java应用的类路径(CLASSPATH)来加载Java类。一般来说,Java应用的类都是由它来完成加载的。可以通过ClassLoader.getSystemClassLoader();来获取它。

除了系统提供的类加载器以外,开发人员可以通过继承 java.lang.ClassLoader类的方式实现自己的类加载器,以满足一些特殊的需求。

图1.类加载器树状结构示意图

技术分享

太累了。。。明天写

JAVA基础_类加载器

原文:http://www.cnblogs.com/homeword/p/7502823.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!