Java类装载器

1.类装器
Java虚拟机使用每一个类的第一件事情是就是将该类的字节码装载进来,装载类的字节码的功能是由类装载器来完成的,类装载器负责根据一个类的名称来定位和生成类的字节码数据然后返回给Java虚拟机。最常见的类装载器是将要加载的类的名称转换成一个.class文件名,然后从文件系统找找到该文件并读取其中的内容,这种累装载器也不是直接将.class文件中的内容原封不动的返回给Java虚拟机,它需要将.class文件中的内容转换成Java虚拟机使用的类字节码,譬如,Java程序中的字符串编译成.class文件后是以UTF-8编码存在的,而装载进Java虚拟机后要被转换成Unicode编码。类装载器本身也是一个Java类,Java虚拟机也允许开发人员编写自己的类装载器,以便通过其他各种特殊方式来产生类字节码,例如,从数据库中装载并建造某个类的字节,甚至根据一个文本文件中描述信息来产生一个类的字节码。我们可以对一些.class文件进行加密处理来防止反编译,但这就需要使用特殊的来装载器从而已被加密处理的.class文件中还原出正常的字节码内容。不管类装载器采用什么方式,只要能够在内存中制造出给Java虚拟机使用的类字节码即可,所以,把类装载器描述为类字节码的制造器更容易让人理解
当一个类被加载后,Java虚拟机将其编译为可执行代码存储在内存中,并将其索引信息存储在一个HashTable中,其索引的关键字就是这个这个类的完整名称。当Java虚拟机需要用到某个类时,它 使用类名称作为关键字在HashTable中查找相应的信息,如果该可执行代码已经存在,Jav虚拟机直接从内存里调用该可执行代码,反之则调用类装载器加载并进行加载编译。
一个Java类用来描述现实生活中有形或无形的事物,甚至可以是一种思想,一种概念。不可否认,Java程序中的类本身也是一种事物,它也可以用一个Java类描述,这个特殊的类名就叫做Class。Class类用于描述Java程序语言中使用的一个类的相关信息。它里面定义了对其所描述的类进行各种操作的方法,例如,Class类中的getName()方法可以获得它所描述的类的名称。可以认为,类装载器装载某个类的字节码的过程实际就是在创建Class类的一个实例对象,这个Class类的实例对象封装的内容正好是当前加载的类的字节码数据,也就是Java虚拟机对当前加载类编译后存储在内存中的可执行代码,要想在程序中获得代表某个类的字节码数据的Class对象,可以采用以下三种方式:

  • 1.类名.class, 例如 System.class
    2.对象.getClass() 例如,new Date().getClass()
    3.Class.forName(“类名”) 例如 Class.forName(“java.util.Date”)

类装载器本身也是一个javalei ,Java类库中提供了一个java.lang.ClassLoder来作为类装载器的基类,Java虚拟机和程序都是调用ClassLoader类的loadLClass方法来加载类,ClassLoader是一个抽象类,真正的装载器必须是ClassLoader类的子类,Class类中定义了有个getClassLoader()方法,用于返回它所描述的类的类装载器,这个返回对象的类型就是CLassLoader。
在一个java虚拟机中可以有多个类装载器,当Java虚拟机要装载一个类时,它通过以下一些方式来选择类装载器:
(1).一个类装载器本身也是一个Java类,所以,类装载器自身也需要被另外一个类类装载器装载,这就出现了类似人类的第一个母亲是如如何产生出来的问题,虽然人类的这个问题至今没有答案,但是java中的类装载器的这个问题却很容易解决 。Java虚拟机中内嵌了一个称为1Bootstrap的类装载器,它是用特定的操作系统的本地d代码类实现的,数据Java虚拟机的内核,这个Bootstrap类装载去器不用专门的类装载器去进行装载。Bootstrap类装载器负责加载java核心包的类(即 rt.jar 文件中的类),这些类的Class.getClassLoader()返回值为null,即表示Bootstrap类装载器,Java核心包有另外两个 类装载器:ExtClassLoader 和 APPClassLoader,它们都是用Java语言编写的Java类,其中ExtClassLoader类装载器负责加载/jre/lib/ext目录下的jar包中的类,APPClassLoader负责加载应用程序的启动的执行类,即当使用java命令去启动执行一个类时,Java虚拟机使用AppClassLoader加载这个类,在编译和运行java程序时,都会通过ExtClassLoader类装载器去

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值