CN1801093A - Java操作系统中类装载的实现方法 - Google Patents
Java操作系统中类装载的实现方法 Download PDFInfo
- Publication number
- CN1801093A CN1801093A CN 200610049141 CN200610049141A CN1801093A CN 1801093 A CN1801093 A CN 1801093A CN 200610049141 CN200610049141 CN 200610049141 CN 200610049141 A CN200610049141 A CN 200610049141A CN 1801093 A CN1801093 A CN 1801093A
- Authority
- CN
- China
- Prior art keywords
- class
- java
- loading
- loading bin
- operating system
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
- 238000011068 loading method Methods 0.000 title claims abstract description 103
- 238000000034 method Methods 0.000 title claims abstract description 49
- 230000003068 static effect Effects 0.000 claims abstract description 10
- 230000006870 function Effects 0.000 claims description 4
- 230000007613 environmental effect Effects 0.000 claims description 3
- 230000008676 import Effects 0.000 claims description 3
- 230000001360 synchronised effect Effects 0.000 claims description 3
- 239000011800 void material Substances 0.000 claims description 3
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000002360 preparation method Methods 0.000 description 1
- 238000012795 verification Methods 0.000 description 1
Landscapes
- Stored Programmes (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明提供了一种Java操作系统中类装载的实现方法。类装载将包含在类文件中的字节码装载到Java操作系统中,通过初始化基本类、装载静态类、处理具体实例类的一个过程,使用一系列装载器,将Java类装载到Java操作系统中运行。本发明对嵌入式系统环境,尤其是面向嵌入式系统的Java操作系统,有重大意义。
Description
技术领域
本发明涉及Java类装载和操作系统,尤其是涉及一种Java操作系统中类装载的实现方法。
背景技术
Java语言是由Sun公司推出的跨平台面向对象高级程序设计语言,目前正在各个领域取得越来越重要的地位,已经成为最重要的程序设计语言之一。
Java语言的可执行代码是编译以后统一标准的Java字节码(Byte Code),只要在一个平台上有Java虚拟机,那么所有的Java可执行代码都可以在这个Java虚拟机支持之下运行,因而Java具有跨平台的优良特性。
目前的Java虚拟机环境之下,没有多进程的概念。Java语言中定义的线程包括一个内存入口点地址、一个出口点地址以及能够顺序执行的代码序列。但是进程与线程的重要区别在于线程不能够单独执行,它必须运行在处于活动状态的应用程序进程中,因此可以定义线程是程序内部的具有并发性的顺序代码流。多线程的意义在于一个应用程序的多个逻辑单元可以并发地执行。但是多线程并不意味着多个用户进程在执行,操作系统也不把每个线程作为独立的进程来分配独立的系统资源。进程可以创建其子进程,子进程与父进程拥有不同的可执行代码和数据内存空间。而在用于代表应用程序的进程中多个线程共享数据内存空间,但保持每个线程拥有独立的执行堆栈和程序执行上下文。在现在操作系统中,多进程并发操作是十分普遍的,而要实现多个Java程序并发,则每一个Java程序的执行都需要一个单独的Java虚拟机来支持。这种方式在通常情况之下并没有太大问题,因为Java可执行代码由虚拟机解释执行,从宿主操作系统(即支持Java虚拟机运行的操作系统)的角度来说,就是一个以一个Java可执行代码作为输入的Java虚拟机进程。多进程的所有相关问题可以由操作系统的进程管理机制来处理。但是在某些特殊情况之下,比如没有宿主操作系统的环境之下,如果要支持多进程并发执行,则必须由虚拟机来负责进程管理的工作。
发明内容
本发明的目的在于提供一种Java操作系统中类装载器的实现方法。
本发明解决其技术问题采用的技术方案如下:
一种Java操作系统中类装载的实现方法:类装载将包含在类文件中的字节码装载到Java操作系统中,并使其成为Java操作系统中运行进程的一部分。
这个类装载过程通过以下方法:
a、初始化基本类
装载基本类型为int、boolean及基本类Object、Class、Void、Boolean、Integer,调用装载静态类方法装载,基本类型也当作类装载并加入到类池表项;
b、装载静态类
将要装载的类名作为该函数的一个参数传入,先通过调用查询类入口方法检查类是不是已经在类池区,如果已经在类池中,则直接返回;如果不在类池中,则分配一个新的类表项结构,并返回指向该处的指针,然后寻找类并装载;
该方法在类路径指定的目录下或者Jar文件中查询类文件,从类库读取字节码,并将其赋值给对象,返回该对象,再将这个对象赋值给classEntry->class指针,然后调用类处理方法处理已装载的类;
c、处理类
由于其他线程可能也要处理同一个类,因此该方法是同步的,处理装载类之前,必须先处理该类的超类,如果该类没有超类,则抛出异常,第一步解决类的对象区、静态区和接口,完成装载过程;第二步验证类的格式;第三步验证字节码;
一个Java应用程序使用两种类型的类装载器:根装载器和用户定义的装载器,根装载器是Java虚拟机实现的一部分,如果一个Java虚拟机是在现在已经存在并且正在被使用的操作系统的顶部用C程序来实现的,那么根装载器将是那些C程序的一部分,根装载器以某种默认的方式将类装入,包括那些JavaAPI的类。在运行期间,一个Java程序能安装用户自己定义的类装载器,根装载器是虚拟机固有的一部分,而用户定义的类装载器则不是,它是用Java语言写的,被编译成class文件之后然后再被装入到虚拟机,并像其它的任何对象一样可以被实例化;
Java操作系统中的类装载模型是一种代理模型,当Java操作系统要求类装载器装载一个类时,类装载器首先将这个类装载请求转发给他的父装载器,只有当父装载器没有装载并无法装载这个类时,类装载器才获得装载这个类的机会,这样所有类装载器的代理关系构成了一种树状的关系;
树的根是类的根装载器,在Java操作系统中它以“null”表示,除根装载器以外的类装载器有且仅有一个父装载器,在创建一个装载器时,如果没有显式地给出父装载器,那么Java操作系统中将默认系统装载器为其父装载器;
Java操作系统中具有:
●根装载器:没有父装载器,是Java操作系统实现的一部分;
●扩展装载器:继承的父装载器为根装载器,不像根装载器可能与运行时的操作系统有关,用纯Java代码实现的;
●系统装载器:从CLASSPATH环境变量中装载代码的,用纯Java代码实现,同时还是用户自定义类装载器的缺省父装载器;
●小应用程序装载器从用户指定的网络上的特定目录装载小应用程序代码。
相比较别的类加载手段,本类装载器寻找一个类或是一个接口的二进制形式,并用该二进制形式来构造代表这个类或是这个接口的class对象。类或接口的名称可以是给定了的,也可以通过寻址得到,通过搜索源代码经过编译器编译后所得到的二进制形式来构造。
本发明具有的有益效果是:
类装载器把一个类装入Java虚拟机中,经过三个装载、链接和初始化步骤来完成,方便的完成校验、准备和解析三步,能够快速加载,而且使用了很少的内存空间,特别适用于嵌入式系统中。尤其是面向嵌入式系统的Java操作系统,有重大意义。
附图说明
附图是Java类装载器的体系结构。
具体实施方法
类装载将包含在类文件中的字节码装载到Java操作系统中,并使其成为Java操作系统中运行进程的一部分。
这个类装载过程通过以下方法:
a、初始化基本类
装载基本类型如int、boolean等及基本类如Object、Class、Void、Boolean、Integer等,调用装载静态类方法装载(基本类型也当作类装载并加入到类池表项)。
b、装载静态类
将要装载的类名作为该函数的一个参数传入。先通过调用查询类入口方法检查类是不是已经在类池区。如果已经在类池中,则直接返回;如果不在类池中,则分配一个新的类表项结构,并返回指向该处的指针。然后,尝试寻找类并装载。
该方法在类路径指定的目录下或者Jar文件中查询类文件,从类库读取字节码,并将其赋值给对象,返回该对象。再将这个对象赋值给classEntry->class指针,然后调用类处理方法处理已装载的类。
c、处理类
由于其他线程可能也要处理同一个类,因此该方法必须是同步的。处理装载类之前,必须先处理该类的超类。如果该类没有超类(如Object),则抛出异常。第一步解决类的对象区、静态区和接口,完成装载过程;第二步验证类的格式;第三步验证字节码。
一个Java应用程序使用两种类型的类装载器:根装载器(bootstrap)和用户定义的装载器(user-defined)。根装载器是Java操作系统实现的一部分,比如,如果一个Java操作系统是在现在已经存在并且正在被使用的操作系统的顶部用C程序来实现的,那么根装载器将是那些C程序的一部分。根装载器以某种默认的方式将类装入,包括那些Java API的类。在运行期间,一个Java程序能安装用户自己定义的类装载器。根装载器是虚拟机固有的一部分,而用户定义的类装载器则不是,它是用Java语言写的,被编译成class文件之后然后再被装入到虚拟机,并像其它的任何对象一样可以被实例化。
Java操作系统中的类装载模型是一种代理模型。当Java操作系统要求类装载器装载一个类时,类装载器首先将这个类装载请求转发给他的父装载器。只有当父装载器没有装载并无法装载这个类时,类装载器才获得装载这个类的机会。这样,所有类装载器的代理关系构成了一种树状的关系。树的根是类的根装载器,在Java操作系统中它以“null”表示。除根装载器以外的类装载器有且仅有一个父装载器。在创建一个装载器时,如果没有显式地给出父装载器,那么Java操作系统中将默认系统装载器为其父装载器。
Java操作系统中具有
●根装载器:没有父装载器,是Java操作系统实现的一部分;
●扩展装载器:继承的父装载器为根装载器,不像根装载器可能与运行时的操作系统有关,用纯Java代码实现的;
●系统装载器:从CLASSPATH环境变量中装载代码的,用纯Java代码实现。同时还是用户自定义类装载器的缺省父装载器。
●小应用程序(Applet)装载器从用户指定的网络上的特定目录装载小应用程序代码。
根据类装载器的不同处理阶段,划分成三个阶段来处理,分别为:类装载、类组装和类处理。附图说明中展示了整个类装载器的流程。
(1)类装载读取类文件的字节码,将这些字节码转换成该Java操作系统的类表示格式,并存储在Java操作系统的方法区中(类池)。
类装载子程序借助类池管理模块查询该类是否已经被装载到Java操作系统类池,如果未被装载,则将该类的入口表项装入类池。当该类的入口表项装载到类池后,从类入口查看该类文件是否已经转换成该Java操作系统的类表示格式并存储在Java操作系统的运行时数据区。如果还未被转换,则借助类路径管理模块为之定位并读取类文件。而类路径管理模块则借助类读取模块将类文件经转换成该Java操作系统的类表示格式。而类读取模块转而借助类组装子程序组装类的数据结构。之后,类装载子程序将已装载的该类的指针传递给类处理模块进行链接、解析和初始化。
(2)类组装调用读入的类信息转换成该Java操作系统的类表示格式,为装载的类添加其源文件信息、接口、内部类信息、方法、异常及域等。
a、根据要装载的类的名字和类装载器来查找这个类是否已经被装载入类池中。一个类可以多次装载入类池中,只要它每次使用不同的类装载器。如果没有找到,就创建一个空的节点。
b、查看状态节点。如该类处于未被装载状态,则判断是需要由其它类装载器装载,还是由自己负责装载。然后,判断是使用自定义的类转载器还是使用系统装载器。
c、根据被装载类的名字,通过类路径环境变量得到它所属目录或jar包中的类全名。再通过类读取函数读出类文件中的内容,返回一个对象。
本Java操作系统软件已经向中华人民共和国版权局申请计算机软件著作权登记。
Claims (1)
1、一种Java操作系统中类装载的实现方法,其特征在于:类装载将包含在类文件中的字节码装载到Java操作系统中,并使其成为Java操作系统中运行进程的一部分;这个类装载过程通过以下方法:
a、初始化基本类
装载基本类型为int、boolean及基本类Object、Class、Void、Boolean、Integer,调用装载静态类方法装载,基本类型也当作类装载并加入到类池表项;
b、装载静态类
将要装载的类名作为该函数的一个参数传入,先通过调用查询类入口方法检查类是不是已经在类池区,如果已经在类池中,则直接返回;如果不在类池中,则分配一个新的类表项结构,并返回指向该处的指针,然后寻找类并装载;
该方法在类路径指定的目录下或者Jar文件中查询类文件,从类库读取字节码,并将其赋值给对象,返回该对象,再将这个对象赋值给classEntry->class指针,然后调用类处理方法处理已装载的类;
c、处理类
由于其他线程可能也要处理同一个类,因此该方法是同步的,处理装载类之前,必须先处理该类的超类,如果该类没有超类,则抛出异常,第一步解决类的对象区、静态区和接口,完成装载过程;第二步验证类的格式;第三步验证字节码;
一个Java应用程序使用两种类型的类装载器:根装载器和用户定义的装载器,根装载器是Java虚拟机实现的一部分,如果一个Java虚拟机是在现在已经存在并且正在被使用的操作系统的顶部用C程序来实现的,那么根装载器将是那些C程序的一部分,根装载器以某种默认的方式将类装入,包括那些Java API的类。在运行期间,一个Java程序能安装用户自己定义的类装载器,根装载器是虚拟机固有的一部分,而用户定义的类装载器则不是,它是用Java语言写的,被编译成class文件之后然后再被装入到虚拟机,并像其它的任何对象一样可以被实例化;
Java操作系统中的类装载模型是一种代理模型,当Java操作系统要求类装载器装载一个类时,类装载器首先将这个类装载请求转发给他的父装载器,只有当父装载器没有装载并无法装载这个类时,类装载器才获得装载这个类的机会,这样所有类装载器的代理关系构成了一种树状的关系;
树的根是类的根装载器,在Java操作系统中它以“null”表示,除根装载器以外的类装载器有且仅有一个父装载器,在创建一个装载器时,如果没有显式地给出父装载器,那么Java操作系统中将默认系统装载器为其父装载器;
Java操作系统中具有:
●根装载器:没有父装载器,是Java操作系统实现的一部分;
●扩展装载器:继承的父装载器为根装载器,不像根装载器可能与运行时的操作系统有关,用纯Java代码实现的;
●系统装载器:从CLASSPATH环境变量中装载代码的,用纯Java代码实现,同时还是用户自定义类装载器的缺省父装载器;
●小应用程序装载器从用户指定的网络上的特定目录装载小应用程序代码。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB2006100491418A CN100346303C (zh) | 2006-01-17 | 2006-01-17 | Java操作系统中类装载的实现方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB2006100491418A CN100346303C (zh) | 2006-01-17 | 2006-01-17 | Java操作系统中类装载的实现方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN1801093A true CN1801093A (zh) | 2006-07-12 |
CN100346303C CN100346303C (zh) | 2007-10-31 |
Family
ID=36811122
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNB2006100491418A Expired - Fee Related CN100346303C (zh) | 2006-01-17 | 2006-01-17 | Java操作系统中类装载的实现方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN100346303C (zh) |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100559346C (zh) * | 2006-10-23 | 2009-11-11 | 国际商业机器公司 | 用于实例化抽象类的系统和方法 |
CN101882190A (zh) * | 2010-06-25 | 2010-11-10 | 清华大学 | 字节码中间表示程序的分模块形式化验证方法 |
CN101426032B (zh) * | 2008-11-28 | 2011-04-13 | 华为终端有限公司 | 安装Java应用的终端及其安装Java应用的方法 |
CN102081523A (zh) * | 2009-11-27 | 2011-06-01 | 浙江省公众信息产业有限公司 | 一种动态加载系统和方法 |
CN102236576A (zh) * | 2011-08-09 | 2011-11-09 | 复旦大学 | 一种支持混合模式执行的Java虚拟机执行引擎 |
CN101441566B (zh) * | 2008-11-18 | 2012-04-25 | 腾讯科技(深圳)有限公司 | 一种在嵌入式平台上动态链接程序的方法 |
CN102567033A (zh) * | 2010-12-14 | 2012-07-11 | 北京大学 | 基于嵌入式实时Java虚拟机的预先类加载方法及装置 |
CN103605748A (zh) * | 2013-11-20 | 2014-02-26 | 北京国双科技有限公司 | 对象的定义合法性检查方法和装置 |
CN101520733B (zh) * | 2008-02-27 | 2014-04-16 | 国际商业机器公司 | 装载类的方法和装置及重组类存档文件方法 |
CN103975307A (zh) * | 2011-12-06 | 2014-08-06 | 国际商业机器公司 | 分布式虚拟机中本机接口的隐藏式自动数据镜像 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CA2255042C (en) * | 1998-11-30 | 2004-04-13 | Leonard W. Theivendra | Class loader |
US20040153996A1 (en) * | 2003-01-30 | 2004-08-05 | International Business Machines Corporation | Method and system for determining the defining classLoader of a Java class as it is being defined |
KR100493893B1 (ko) * | 2003-02-07 | 2005-06-10 | 삼성전자주식회사 | 자바 프로그램에서 클래스 로딩 과정을 단축시키는 시스템및 방법 |
-
2006
- 2006-01-17 CN CNB2006100491418A patent/CN100346303C/zh not_active Expired - Fee Related
Cited By (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100559346C (zh) * | 2006-10-23 | 2009-11-11 | 国际商业机器公司 | 用于实例化抽象类的系统和方法 |
CN101520733B (zh) * | 2008-02-27 | 2014-04-16 | 国际商业机器公司 | 装载类的方法和装置及重组类存档文件方法 |
CN101441566B (zh) * | 2008-11-18 | 2012-04-25 | 腾讯科技(深圳)有限公司 | 一种在嵌入式平台上动态链接程序的方法 |
CN101426032B (zh) * | 2008-11-28 | 2011-04-13 | 华为终端有限公司 | 安装Java应用的终端及其安装Java应用的方法 |
CN102081523A (zh) * | 2009-11-27 | 2011-06-01 | 浙江省公众信息产业有限公司 | 一种动态加载系统和方法 |
CN101882190B (zh) * | 2010-06-25 | 2012-11-14 | 清华大学 | 字节码中间表示程序的分模块形式化验证方法 |
CN101882190A (zh) * | 2010-06-25 | 2010-11-10 | 清华大学 | 字节码中间表示程序的分模块形式化验证方法 |
CN102567033A (zh) * | 2010-12-14 | 2012-07-11 | 北京大学 | 基于嵌入式实时Java虚拟机的预先类加载方法及装置 |
CN102567033B (zh) * | 2010-12-14 | 2015-09-16 | 北京大学 | 基于嵌入式实时Java虚拟机的预先类加载方法及装置 |
CN102236576A (zh) * | 2011-08-09 | 2011-11-09 | 复旦大学 | 一种支持混合模式执行的Java虚拟机执行引擎 |
CN102236576B (zh) * | 2011-08-09 | 2015-01-07 | 复旦大学 | 一种支持混合模式执行的Java虚拟机执行引擎 |
CN103975307A (zh) * | 2011-12-06 | 2014-08-06 | 国际商业机器公司 | 分布式虚拟机中本机接口的隐藏式自动数据镜像 |
CN103975307B (zh) * | 2011-12-06 | 2017-05-31 | 国际商业机器公司 | 分布式虚拟机中本机接口的隐藏式自动数据镜像 |
CN103605748A (zh) * | 2013-11-20 | 2014-02-26 | 北京国双科技有限公司 | 对象的定义合法性检查方法和装置 |
CN103605748B (zh) * | 2013-11-20 | 2017-04-12 | 北京国双科技有限公司 | 对象的定义合法性检查方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
CN100346303C (zh) | 2007-10-31 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN100346303C (zh) | Java操作系统中类装载的实现方法 | |
Albahari | C# 10 in a nutshell: the definitive reference | |
US6658421B1 (en) | System and method for detecting release-to-release binary compatibility in compiled object code | |
EP2365436B1 (en) | Overriding outputs in a producer graph oriented programming and execution system | |
CN106462425B (zh) | 使用复常量的方法和系统 | |
US8434099B2 (en) | Efficient linking and loading for late binding and platform retargeting | |
CA2267477C (en) | Packaging memory image files | |
US20040255268A1 (en) | Systems and methods providing lightweight runtime code generation | |
US6851114B1 (en) | Method for improving the performance of safe language multitasking | |
CA2507371C (en) | Method for generating interpretable code for storage in a device having limited storage | |
CN1848088A (zh) | 将本机接口函数调用转换为更简单操作的方法和系统 | |
CN1577268A (zh) | 共享库系统及构建该系统的方法 | |
US20040268301A1 (en) | Adding new compiler methods to an integrated development environment | |
CN1834918A (zh) | 一种组件间调用方法 | |
Ichisugi et al. | Difference-based modules: A class-independent module mechanism | |
US11048489B2 (en) | Metadata application constraints within a module system based on modular encapsulation | |
US20040015850A1 (en) | Specialized heaps for creation of objects in object-oriented environments | |
Urbanek | How to talk to strangers: ways to leverage connectivity between R, Java and Objective C | |
Wizard et al. | API Portability Analyzer, 605 APIs (Application Programming Interfaces), 560 applications, 10 cross-platform programs and, 581 Append () method, 335 | |
Hlopko et al. | Towards a Runtime Code Update in Java. | |
Lidin | . NET IL Assembler | |
Goetz | Interface evolution via “public defender” methods | |
Khuntia | Object Oriented Programming using Java | |
Maessen et al. | λS: An implicitly parallel λ-calculus with recursive bindings, synchronization and side effects | |
Lumpe | Using metadata transformations to integrate class extensions in an existing class hierarchy |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
C17 | Cessation of patent right | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20071031 Termination date: 20120117 |