信息科学
Java类装载机制的研究及应用
周洪照耿祥义
(大连交通大学,辽宁大连116028)
引言
随着网络的普及,以网络为核心的硬件环境所包含的硬件设备的广泛性和多样性以及由此带来的软件的安全性、程序的健壮性和可迁移性逐渐成为软件开发者必须面对的挑战。继c和c++之后成为商业软件主流的开发语言java所具有的平台无关性、安全性和网络移动性则很好的帮助软件开发者面对挑战抓住机遇。而java语言面向网络的的核心就是java虚拟机——
—所有的java程序都在其上面运行。深入了解java虚拟机则成为每个java开发人员得心应手的使用java语言的必要前提。所有的这一切就要从java的类装载机制开始。
1java虚拟机的体系结构
Java虚拟机的内部基本结构如图1所示
当虚拟机要执行一个程序时必须首先获得该程序的字节码。每个虚拟机都有一个类装载子系统,他根据给定的全限命名来装入指定的类或接口,然后由执行引擎执行包含在被装载类的方法中的指令。
2类装载子系统
Java虚拟机有两种类装载器:启动类装载器和用户自定义的装载器[1]。java类型要么由启动类装载器装载,要么由用户自定义的类装载器装载。
启动类装载器:每个java虚拟机实现都必须有一个启动类装载器,只要给定某个类型的全限命名,启动类加载器就必须能够以某种方式得到定义该类型的数据。图2中的bootstrap就是启动类加载器,它在虚拟机启动后负责加载核心javaAPI类。
用户自定义加载器:这种装载器能够使用自定义的方式来装载类,类装载子系统中除了boot-strap类加载器之外的都是用户自定义的类加载器,包括standardExt和system类加载器。其中standardExt负责加载java扩展类(¥JA-
VA_HOME/jre/lib/ext目录中的所有
类),system负责加载ClassPath中设置
的路径的类,它是默认的类加载器,一般
用户应用程序的类都由此加载器负责加
载。所有用户自定义加载器都必须继承
java.lang.ClassLoader类,通过调用用户
自定义加载器的laodClass方法来加载
java类。
3类装载器的装载模式和过程
3.1装载模式。java类加载模式称
为双亲委派加载模式,当一个类加载器被要求加
载某个类时,它先委托它的父加载器加载这个类,
父加载器再委托它的父加载器加载这个类,直到
某个加载器能够加载或者已经加载了这个类为
止。如果一直到根加载
器都不能加载这个类,
则逐级返回,由最初的
加载器尝试加载。每个
java类只能由一个加载
器加载。
3.2装载过程。在运
行java.exe时,java.exe首
先找到虚拟机运行环境
JRE中的jvm.dll文件,
启动虚拟机
由bootstrap类加载
器加载核心javaAPI类,
standardExt类加载器加
载¥JAVA_HOME/jre/lib
/ext下的所有jar包,再
由system类加载器加载
由系统参数java.class.
path得到的类的搜索路
径。
包含main()的入口类由system的laodclass()
方法载入。
由New关键字创建的某个类的一个实例,该
类由包含new语句类的类装载器的loadclass方法
载入。
下面我们看一段简单的程序来说明加载的
顺序:
PublicclassTestClass{
Publicstaticvoidmain(String[]args){
Stringstr=newString("hello");
Integer.toString(5);
……
Testtest=newTest();
……
}
}
上面的一段简单的代码再执行的时候,系统
地启动加载器bootstrap首先加载java核心
API类,standerExt加载¥JAVA_HOME/jre/li
b/ext下面的jar包,而包含main方法的TestClass
类则由system类加载器加载。当运行到Stringstr
=newString("hello");时,system加载器委托
standerExt加载器加载类String,standerExt加载器
委托bootstrap类加载器加载,而此时bootstrap类
加载器发现已经加载过String类,程序向下运行,
Tnteger类的加载过程也类似。当加载器要加载
Test类时,standerExt类加载器和bootstrap加载器
都无法加载,则由TestClass类所在的system类加
载器负责加载,如果Test类存放在system类加载
器的系统参数java.class.path得到的搜索路径的目
录下面时,则由system类加载器就加载Test类,
如果不在,则Test类就无法加载,此时程序运行抛
出异常。
3.3加载方式。类的加载方式可分为两种显式
加载和隐式加载[2]
显式加载:通过class的forName方法来加
载,相当于
this.getClass(XXX).getClassLoader.loadClass
(XXX,true);如
ClassdoubleClass=Class.forName("java.
lang.Double");
隐式加载:相当于使用当前正在执行的类的
加载器来加载类,默认情况下,所有的java程序的
类都是通过system类加载器加载的。
3.4用户自定义类加载器的工作流程。编写用
户自定义类加载器之需要重载findClass方法即
可。具体流程图如图3所示。
4类加载器的简单应用示例
用户自定义的加载器使类的加载和实例化
可以放到运行时决定,能够实现在线加载、再现升
级的功能,同时可以扩展class文件的来源,使
bootstrap_system层次的ClassLoader不仅仅能存
取本地的class文件,同时可以从网络、数据库等
处获得class文件。下面给出一个简单的运用类的
装载机制实现的在线升级的示例:
publicInterfaceI{
Stringexec(Stringarg);
}
PublicAimplementsI{
摘要:java语言是一种动态解释性编程语言,它与c和c++编译后生成一个可执行文件不同,java编译后只生成一个个的字节码。class文件,而在运行时按需求和一定的规则载入内存。介绍了java类的装载机制,并通过一个简单的在线升级程序示例说明装载机制的应用。
关键词:java虚拟机;装载机制;在线升级
图2
图3
(下转152页)
文化教育
Stringexec(Stringarg){
Return"hello"+arg;
}
}
publicUserClassLoaderextendsClassLoader{…};
//在线升级
PublicClassServiceManager{
Iai;
Publicinit(){
UserClassLoaderuserCL=newUser-ClassLoader();
ClassaClass=userCL.loadClass("A");
Ai=(I)aClass.newInstance();//现在可以调用ai处理业务逻辑
//启动检测线程,检查A.class文件的变化
}//检测线程一旦发现A.class文件发生变化,则调用如下代码
/*
UserClassLoaderuserCl=newUserClass-Loader();
ClassaClass.newInstance();
*/
}
5小结
了解java类的装载机制,有助于我们更深一步的学习java这门技术,更熟练的掌握java编程技巧和内部运行机制,有助于提高程序的运行效率和质量。
参考文献
[1]BillVenners.深入java虚拟机.曹晓刚,蒋靖译.[M].北京:机械工业出版社,2003,9.
[2]黄明,刘阳.java虚拟机加载机制浅析[J].科技咨询导报,2007,9.
刍议语文教学中学生创新意识的培养
黎峰
(江苏省无锡市苏南技术学校,江苏无锡214073)
1更新教师观念,树立创新性教学意识
教师要加强新课改理论的学习,在实际工作中,大胆探索,勇于实践,不断转变教育观念,树立“一切为了孩子,为了孩子一切,为了一切孩子”的新理念,是培养学生创新意识的前提条件。具体地说,培养学生的创新意识,教师必须具备以下观念:
1.1素质观。素质教育是大势所趋,势在必行。语文素质的核心是语文创新能力,语文创新能力强是语文素质高的重要标志。可以这么说,没有语文创新能力,就没有真正意义上的语文素质,因为具有创新能力的语文素质,才具有极强的生命力和巨大的爆发力。所以,语文课堂必须肩负起历史赋予的重任,着力培养以创新能力为核心的语文素质。
1.2人本观。只有树立了以人为本的观念,才能开发学生的创新智力,发展他们的创新思维,培养他们的创新表达;才能不为应试教育所左右,不为琐碎练习所束缚,不被满堂灌所淹没,才能使学生产生创新智慧,迸发创新火花,获得创新见识。
1.3主体观。没有学生的创新,就没有语文课堂的创新,后者是依靠前者的存在而存在,随着前者的发展而发展的,所以要想语文课堂教学创新,就必须树立学生是主体的观点。因为如果没有主体观点,学生就成不了主人,那绝不会有什么创新可言。
1.4民主观。教育要民主,教学更需要民主。只有在和谐的环境里,学生才能够畅所欲言,大胆创新,提出独到见解。试想,如果教师一发话,如同下了圣旨,还有学生的百花齐放,百家争鸣吗?学生不能“放”,不能“鸣”,何来语文课堂教学的创新?
2改革课堂结构,培养学生的创新意识
教师具备了创新理念,要培养学生的创新意识,还必须改革课堂结构,必须改革现有的课堂教学模式,让学生主动地参与到教学之中去,真正成为学习的主人。
首先,要把教师的“教”转变为学生的“学”,创造一种适合每个学生生动活泼,主动发展的教学氛围,让学生体验到主动获取知识的乐趣,体验在主动参与学习的过程中获得成功的喜悦。语文教学中,我采用“自学——
—讨论交流——
—启发指导——
—练习迁移”这一教学模式来培养学生的创新意识和创新能力。
其次,把“应试”训练转变为应用所学的知识去解决实际问题能力的训练。学生应在教师的启发和引导下,应用所学的知识,去探索发现问题和解决问题的方法,努力做到举一反三,触类旁通的目的。语文课堂应给学生以无限的空间,让畅想的思维自由飞翔,每节课都应有真情的交融,高峰的体验,心潮的激荡,灵感的爆发。教师要为学生的创新训练创造条件,提供机会,让学生自己选择
或设计训练题,去探索解决问题的途径与方法,使
学生的形象思维和创造思维同时得到发展。
第三,把传统的教学专制现象转变为教学
民主化措施。实现教学民主化是将教师的“教”和
学生的“学”成为一种课堂互动,彼此交流的过
程,让教学在活跃,和谐的气氛中人人参与,平等
对话,互相学习的过程中进行,使师生在人格上
处于平等地位,让学生真正成为有血有肉,有创新
能力的学习主人。教师要对好质疑,好提出“怪”
问题,提出超越教材范围的问题的学生,给予鼓励
和引导,持热情支持的态度。这样做不仅使学生
的人格和自尊心得到保护,同时他们的智力和潜
能才能得到开发,创新意识才能得到培养和提
高。
3通过创设问题情景,培养学生的创新意识
学会创设问题情景,是培养学生创新意识的
重要途径之一。问题是创造之源,疑问是创造之
母。培养学生的创新意识,首先就要从培养和解
决学生的问题意识开始。这就要求教师深入钻研
教材,了解学生,确定教学目标,设计出把教学目
标转化为学习行为目标的问题。其次,充分发挥
学生合作学习的功能。对于问题的答案或处理意
见有分歧时,教师要利用小组合作学习的形式,
在合作中,通过师生交流,辩论,生生交流,小组之
间的交流,获得解决问题的途径和方法,使学生
在认知冲突中,处于一种主动,活跃的积极思维状
态,进而唤起学生的问题意识,产生学习需要。
4在观察比较中培养学生的创新意识
在课堂上,观察比较又是培养学生创新意识
的另一途径。学生的心理特征和年龄特点决定了
他们对生动形象的事物容易产生兴趣,容易理解
和记忆。根据这一特点,教学时,必须正确,合理的
利用声像,插图,让学生多角度观察对比,多途径
思考,多渠道解决实际问题,归纳出本质的东西,
培养学生的创新意识。
5在开放的练习中培养学生的创新意识
开放练习是培养学生个性创新的重要途径
之一。创新不是凭空臆造,需要有扎实的基础知
识和基本能力,但有了基础知识和基本能力,也不
一定能创造。学生在语文教学中获取了知识,养
成了能力,还懂得学以致用,这才是语文教学的最
终目的。因此,教师在教学中还要适当设计开放
性问题,给学生提供一个能够充分表现个性,激励
创新的空间。如在教学《水调歌头?明月几时有》
一文时,要求学生说出月亮的几个别称,背诵跟月
亮有关的诗句,学生们兴致盎然,说出了“玉兔,蟾
宫,婵娟”等几个别称,背诵了“月落乌啼霜满天”,
“秦时明月汉时关”,“明月松间照,清泉石上流”等
十余句跟月亮有关的诗句,从而在理解课文的基
础上学到了许多课本上学不到的鲜活的知识。
总之,在语文课堂教学中,培养学生的创新
意识,是一个新旧教学观念,教学结构,教学方法
更新的过程。要实现这一过程,教师必须加强学
习,提高自身素质和理论水平,转换角色,大胆改
革,勇于实践,从培养学生参与教学入手,在优化
课堂教学的过程中,鼓励学生不囿于教师和教材
的定论,敢于怀疑,大胆质疑,敢于超越权威学说,
从而促进学生创造思维的发展,培养学生的创造
精神,使创新真正成为学生的一种自觉的行为。
摘要:在新一轮课程改革中,作为语文教师,要大力推行素质教育,树立人本主义的教育思想,把自身“传道,授业,解惑”的角色转变为学生自主学习,探究性学习,合作学习的促进者,引导者和合作者。努力改革课堂结构,改进教学方法,通过创设问题情景,观察比较和在开放的练习中培养学生的创新意识,终身学习的能力。
关键词:语文教学;创新意识;培养
(上接46页)
北大青鸟推荐:Java精选笔试题(含答案解析)如果你是计算机专业出生,但是还没有找到工作的话,你就得补补技术了,一些关于面试、笔试的题要多刷一刷。有可能你知道答案,但是由于语言组织能力有所欠缺,所以面试官的印象不是很好,下面分享一些Java精选的鄙视题,希望对面试这者有帮助。 1,volatile关键字是否能保证线程安全?() 答案:否 volatile关键字用在多线程同步中,可保证读取的可见性,JVM只是保证从主内存加载到线程工作内存的值是最新的读取值,而非cache中。但多个线程对volatile的写操作,无法保证线程安全。 假如线程1,线程2 在进行read,load 操作中,发现主内存中count的值都是5,那么都会加载这个最新的值,在线程1对count进行修改之后,会write到主内存中,主内存中的count变量就会变为6;线程2由于已经进行read,load操作,在进行运算之后,也会更新主内存count的变量值为6;导致两个线程及时volatile关键字修改之后,还是会存在并发的情况。 2,下面哪个流类属于面向字符的输入流( ) A、BufferedWriter B、FileInputStream C、ObjectInputStream D、InputStreamReader 答案:D Java的IO操作中有面向字节(Byte)和面向字符(Character)两种方式。
面向字节的操作为以8位为单位对二进制的数据进行操作,对数据不进行转换,这些类都是InputStream和OutputStream的子类。 面向字符的操作为以字符为单位对数据进行操作,在读的时候将二进制数据转为字符,在写的时候将字符转为二进制数据,这些类都是Reader和Writer的子类。 3,Java能不能不通过构造函数创建对象() A、能 B、不能 答案:A Java创建对象的几种方式: (1) 用new语句创建对象,这是最常见的创建对象的方法。 (2) 运用反射手段,调用https://www.wendangku.net/doc/0b17104740.html,ng.Class或者https://www.wendangku.net/doc/0b17104740.html,ng.reflect.Constructor类的newInstance()实例方法。 (3) 调用对象的clone()方法。 (4) 运用反序列化手段,调用java.io.ObjectInputStream对象的readObject()方法。 (1)和(2)都会明确的显式的调用构造函数;(3)是在内存上对已有对象的影印,所以不会调用构造函数;(4)是从文件中还原类的对象,也不会调用构造函数。 4,下列哪个叙述是正确的() A.子类继承父类的构造方法。 B.abstract类的子类必须是非abstract类。 C.子类继承的方法只能操作子类继承和隐藏的成员变量。 D.子类重写或新增的方法也能直接操作被子类隐藏的成员变量。 答案:C 子类是不继承父类的构造方法的,而是必须调用其父类的构造方法。
永隆 JAVA笔试题 一、选择题 1、关于Java 类的加载过程,下面哪些描述是正确的() A、在 Java 中,有四种类型的类加载器:BootStrapClassLoader、ExtClassLoader、AppClassLoader 以及用户自定义的ClassLoader。//Extension ClassLoader, System ClassLoader+用户自定义的classloader B、使用 new 关键字创建类实例时,其实就显示地包含了类的加载过程 C、在 Java 中,类的实例化流程分为两个部分:类的加载和类的实例化。类的加载又分为显式加载和隐式加载。 D、Class.forName 来加载类时,是通过 ExtClassLoader进行加载的。 //system classLoader 加载 2、关于HashMap的实现机制,下面哪些描述是正确的() A、HashMap中key-value 当成一个整体进行处理,系统总是根据数组的坐标来获得key-value 的存储位置。//没有存储顺序,无下标之说! B、HashMap基于哈希表的 Map 接口的实现,允许使用 null 值和 null 键。 C、如果HashMap中,如果Key的hash相同的话,HashMap将会出错。//会替换相应的value D、HashMap每次容量的扩增都是以2的倍数来增加。//大约获得2倍的桶数! 3、下面的代码执行输出正确的是() 1. public class test( 2. public int aMethod()[ 3. static int i=0; 4. i++; 5. return I; 6. ) 7. public static void main (String args[]){ 8. test test = new test(); 9. test.aMethod(); 10.int j = test.aMethod(); 11.System.out.printIn(j); 12.] 13.} A. 编译错误 B. 编译成功,打印出是“0” C. 编译成功,打印出是“1” D. 编译成功,打印出是“2” A 4、如何获取下面表单 select