CN100346303C - Java操作系统中类装载的实现方法 - Google Patents

Java操作系统中类装载的实现方法 Download PDF

Info

Publication number
CN100346303C
CN100346303C CNB2006100491418A CN200610049141A CN100346303C CN 100346303 C CN100346303 C CN 100346303C CN B2006100491418 A CNB2006100491418 A CN B2006100491418A CN 200610049141 A CN200610049141 A CN 200610049141A CN 100346303 C CN100346303 C CN 100346303C
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.)
Expired - Fee Related
Application number
CNB2006100491418A
Other languages
English (en)
Other versions
CN1801093A (zh
Inventor
陈天洲
戴鸿君
黄彧
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Zhejiang University ZJU
Original Assignee
Zhejiang University ZJU
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Zhejiang University ZJU filed Critical Zhejiang University ZJU
Priority to CNB2006100491418A priority Critical patent/CN100346303C/zh
Publication of CN1801093A publication Critical patent/CN1801093A/zh
Application granted granted Critical
Publication of CN100346303C publication Critical patent/CN100346303C/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Abstract

本发明提供了一种Java操作系统中类装载的实现方法。类装载将包含在类文件中的字节码装载到Java操作系统中,通过初始化基本类、装载静态类、处理具体实例类的一个过程,使用一系列装载器,将Java类装载到Java操作系统中运行。本发明对嵌入式系统环境,尤其是面向嵌入式系统的Java操作系统,有重大意义。

Description

Java操作系统中类装载的实现方法
技术领域
本发明涉及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程序的一部分,根装载器以某种默认的方式将类装入,包括那些Java API的类;在运行期间,一个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程序的一部分,根装载器以某种默认的方式将类装入,包括那些JavaAPI的类;在运行期间,一个Java程序能安装用户自己定义的类装载器,根装载器是虚拟机固有的一部分,而用户定义的类装载器则不是,它是用Java语言写的,被编译成class文件之后然后再被装入到虚拟机,并像其它的任何对象一样可以被实例化;
Java操作系统中的类装载模型是一种代理模型,当Java操作系统要求类装载器装载一个类时,类装载器首先将这个类装载请求转发给他的父装载器,只有当父装载器没有装载并无法装载这个类时,类装载器才获得装载这个类的机会,这样所有类装载器的代理关系构成了一种树状的关系;
树的根是类的根装载器,在Java操作系统中它以“null”表示,除根装载器以外的类装载器有且仅有一个父装载器,在创建一个装载器时,如果没有显式地给出父装载器,那么Java操作系统中将默认系统装载器为其父装载器;
Java操作系统中具有:
●根装载器:没有父装载器,是Java操作系统实现的一部分;
●扩展装载器:继承的父装载器为根装载器,不像根装载器可能与运行时的操作系统有关,用纯Java代码实现的;
●系统装载器:从CLASSPATH环境变量中装载代码的,用纯Java代码实现,同时还是用户自定义类装载器的缺省父装载器;
●小应用程序装载器:从用户指定的网络上的特定目录装载小应用程序代码。
CNB2006100491418A 2006-01-17 2006-01-17 Java操作系统中类装载的实现方法 Expired - Fee Related CN100346303C (zh)

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 CN1801093A (zh) 2006-07-12
CN100346303C true 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 (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2012079335A1 (zh) * 2010-12-14 2012-06-21 北京大学 基于嵌入式实时java虚拟机的预先类加载方法及装置

Families Citing this family (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8214811B2 (en) * 2006-10-23 2012-07-03 International Business Machines Corporation Instantiating an interface or abstract class in application code
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 清华大学 字节码中间表示程序的分模块形式化验证方法
CN102236576B (zh) * 2011-08-09 2015-01-07 复旦大学 一种支持混合模式执行的Java虚拟机执行引擎
US8863129B2 (en) * 2011-12-06 2014-10-14 International Business Machines Corporation Automated caching and mirroring of immutable data in distributed virtual machines via native interface components
CN103605748B (zh) * 2013-11-20 2017-04-12 北京国双科技有限公司 对象的定义合法性检查方法和装置

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6470494B1 (en) * 1998-11-30 2002-10-22 International Business Machines Corporation 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
CN1519709A (zh) * 2003-02-07 2004-08-11 三星电子株式会社 用于缩短java程序中的类加载处理的系统和方法

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6470494B1 (en) * 1998-11-30 2002-10-22 International Business Machines Corporation 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
CN1519709A (zh) * 2003-02-07 2004-08-11 三星电子株式会社 用于缩短java程序中的类加载处理的系统和方法

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
Java动态类加载机制及其应用 张敦华,刘建,计算机工程与设计,第25卷第3期 2004 *
Java虚拟机中类装载机制的原理分析与应用研究 李超,方潜生,安徽建筑工业学院学报(自然科学版),第13卷第5期 2005 *

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2012079335A1 (zh) * 2010-12-14 2012-06-21 北京大学 基于嵌入式实时java虚拟机的预先类加载方法及装置

Also Published As

Publication number Publication date
CN1801093A (zh) 2006-07-12

Similar Documents

Publication Publication Date Title
CN100346303C (zh) Java操作系统中类装载的实现方法
Albahari C# 10 in a Nutshell
US7219329B2 (en) Systems and methods providing lightweight runtime code generation
US6658421B1 (en) System and method for detecting release-to-release binary compatibility in compiled object code
CN1171147C (zh) 自动的承接软件/适配器生成器
EP3180734B1 (en) Restrictive access control for modular reflection
EP2365436B1 (en) Overriding outputs in a producer graph oriented programming and execution system
CA2267477C (en) Packaging memory image files
CN1119756C (zh) 用于进行静态初始化的方法和系统
US7493605B2 (en) Method and a software product for adapting a .Net framework compliant reflection mechanism to a java environment
US10853096B2 (en) Container-based language runtime loading an isolated method
US6851114B1 (en) Method for improving the performance of safe language multitasking
WO2015175649A1 (en) Handling value types
CN111966424A (zh) 使用复常量的方法和系统
EP1570347B1 (en) Method for generating interpretable code for storage in a device having limited storage
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
CN103631645A (zh) 一种基于数字医疗的数字家庭中间件系统
CN104063229A (zh) 一种数字家庭中间件系统
Tack et al. Generic pickling and minimization
Lidin . NET IL Assembler
Goetz Interface evolution via “public defender” methods
Álvarez Gutiérrez et al. Applying lightweight flexible virtual machines to extensible embedded systems

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