已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
类加载机制初探记得在刚学JAVA的时候,类的加载机制和初始化顺序经常被弄的糊里糊涂,其实当我们不太了解某些事情的时候,不防去做一做实验,让代码的运行结果说话,这或许能帮助我们更好地了解一些事情.今天我们就用一些代码来看一下类是如何被加载的,并且当有继承关系的时候,类的加载顺序又是怎么样的.先看代码吧/*Test4.java*Createdon2007-9-21,9:33:31*Tochangethistemplate,chooseTools|Templates*andopenthetemplateintheeditor.*/packagetest1;/*authorhadeslee*/publicclassTest4privatevoidtestClassForName(Stringname)throwsClassNotFoundExceptionClassc=Class.forName(name);privatevoidtestNewInstance(Stringname)throwsClassNotFoundException,InstantiationException,IllegalAccessExceptionClassc=Class.forName(name);Objectobj=c.newInstance();System.out.println(obj);publicstaticvoidmain(Stringargs)throwsExceptionTest4t=newTest4();t.testClassForName(test1.B);newB();newB();classAprivateintaj;aj=20;System.out.println(A成员初始化块);privatestaticintai;staticai=10;System.out.println(A静态初始化块);publicA()System.out.println(A构造函数);classBextendsAprivatestaticintbi;staticbi=30;System.out.println(B静态初始化块);privateintbj;bj=40;System.out.println(B成员初始化块);publicB()System.out.println(B构造函数);在代码里面我们总共有三个类,一个是做测试用的Test4,一个是A,一个是A的子类B,我们在A和B类里面都有很多输出,一个是静态初始化的输出,一个是成员初始化的输出,一个是在构造函数里面的输出,从这些输出我们可以知道代码的执行顺序,以上代码运行输出如下:A静态初始化块B静态初始化块A成员初始化块A构造函数B成员初始化块B构造函数A成员初始化块A构造函数B成员初始化块B构造函数从上面我们可以看出,A和B的静态初始化块只被执行了一次,也就是类的对象将要被生成的时候,它会执行,并且执行的顺序如下:父类的静态成员,子类的静态成员,父类的成员变量和构造方法,子类的成员变量和构造方法.当再用这个类生成对象的时候,静态的部份就不再被调用了.因为静态是类的所有实例所共享的,所以它在整个虚拟机的生命周期内只执行一次.如果我们加上一个t.testClassForName(test1.B);放在main函数的最后面,我们会发现输出还是和刚刚一样,没有任何改变,这个时候,我们知道,当我们调用Class.forName(name);的时候,类是不会自动初始化的,它默认只是把这个类的字节码读入内存,但是并没有初始化这个类.只有我们调用了newInstance()的时候,它才会被初始化.在这里我们再这样试一下:把A和B生成的class文件去掉,然后再分别调用Class.forName和new B(),看看会怎么样,我们会发现当我们调用Class.forName的时候,当我们要for的Name找不到的时候,只会抛出ClassNotFoundException,注意,它只是一个异常而已,而当我们new B()的时候,B的class文件却被我们删掉了,那就事大了,那就将抛出NoClassDefFoundError,呵呵,它就是一个Error了,这点区别我们可要注意啦,当我们在做这些事情的时候,一个只要捕获异常就可以了,一个却需要捕获一个Error,一般来说,Error级别的错误是不希望程序员去捕获的.了解了类的基本加载顺序以及加载机制后,对我们了解JAVA是有一定的帮助的.好了,先讲这些吧,有关类的加载机制以后再继续分享:) JAVA6.0操作脚本语言JDK6.0里面加了一个很实用的包,javax.script,它是JAVA新增的操作脚本的包,利用它我们可以对脚本语言进行操作,比如修改,或者调用,并且可以和JAVA语言交互,如果我们利用好的话,我们利用它来实现一些经常要改的部份,这样我们就可以把一些算法写到js文件里面,然后再在运行的时候读取出来并执行,这样就省去了更改一些东西需要重新编译的过程了.下面我们就来看一个例子吧,看看如何在JAVA代码里面操作脚本并调用里面的方法./*Test.java*Createdon2007-9-19,15:28:49*Tochangethistemplate,chooseTools|Templates*andopenthetemplateintheeditor.*/packagelbf.script;importjava.io.FileReader;importjava.util.ArrayList;importjava.util.List;importjavax.script.Bindings;importjavax.script.Invocable;importjavax.script.ScriptContext;importjavax.script.ScriptEngine;importjavax.script.ScriptEngineManager;importjavax.swing.JFrame;/*authorhadeslee*/publicclassTestpublicstaticvoidmain(Stringargs)throwsException/根据js的后缀名生成一个解析JS的脚本解析引擎ScriptEngineengin=newScriptEngineManager().getEngineByExtension(js);/查询一下这个引擎是否实现了下面很实用的接口System.out.println(engininstanceofInvocable);/声明两个对象,传入到JS里面去JFramejf=newJFrame(test);Listlist=newArrayList();/得到挷定的键值对象,把当前的两个JAVA对象放进去Bindingsbind=engin.createBindings();bind.put(jf,jf);bind.put(list,list);/把挷下的键值对象放进去,作用域是当前引擎的范围engin.setBindings(bind,ScriptContext.ENGINE_SCOPE);/用引擎执行一段写在JS文件里面的代码Objectobj=engin.eval(newFileReader(test.js);/这个时候返回值当然是null了System.out.println(obj);/把当前的引擎强制转为Invocable,这样就可以调用定义在JS文件里面的一个一个函数了Invocablein=(Invocable)engin;/得到了从JS里面返回来的对象Listl=(List)in.invokeFunction(getNames);System.out.println(l);/调用一下定义在JS里面的另一个函数in.invokeFunction(testJS);/最后调用一个函数,该函数可以使我们前面定义的窗体显示出来in.invokeFunction(doSth);下面是定义在test.js里面的内容functiondoSth()jf.setSize(500,300);jf.setVisible(true);jf.setDefaultCloseOperation(jf.EXIT_ON_CLOSE);functiongetNames()list.add(doSth);list.add(getNames);returnlist;functiontestJS()print(Helloworld!);我们可以看到,在JAVA运行了以后,窗体会显示出来,并且我们可以接收到从JS解析引擎里面传回的数据,当然我们也可以调用一个很普通的JS函数,想象一下,如果我们把我们程序运行时的一些对象都设到Bindings里面去,那么我们JS岂不是有很大的自由度了吗?因为JS里面也可以操作我们的JAVA对象了,并且我们可以像JAVA编程一样的对JS编程了,还不用再编译,马上就可以运行.灵活性岂不是变得更高了吗?过几天写一个利用JAVA解析JS提高编程灵活性的例子,以体现一下这个包的用处,不过,JS的缺点就是执行速度慢,比起JAVA代码那是慢多了,但是一些初始化的事情,或者一些设置的事情,我们就不用写死在程序里面了,就可以从我们定义的JS文件里面读取了,毕竟那些只执行一次的方法牺牲一点效率换来很高的灵活度是很值得的.Java 如何判断String为空?str=null | str.equals() (注意顺序) 再澄清一个概念: 如果str=null说明str还未定
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年黄冈职业技术学院单招职业倾向性考试题库及完整答案详解1套
- 2025河北保定阜平农业开发有限公司招聘笔试备考试卷带答案解析
- 2026中国中铁大桥勘测设计院集团有限公司校园招聘参考试题附答案解析
- 2025广东潮州市湘桥区教育系统招聘教师41人笔试题库(编制)附答案解析
- 2026年云南工贸职业技术学院单招职业倾向性考试题库附答案
- 2026年内蒙古伊克昭盟单招职业倾向性考试题库必考题
- 2026年淮南师范学院单招职业技能测试题库带答案
- 2026年无锡工艺职业技术学院单招职业适应性测试题库汇编
- 2026年日照航海工程职业学院单招职业技能考试题库必考题
- 2026年武夷山职业学院单招职业适应性考试题库必考题
- 2025课堂惩罚 主题班会:马达加斯加企鹅课堂惩罚 课件
- 本科《行政领导学》期末纸质考试总题库2025版
- 肘管综合征超声诊断与评估
- 口腔种植学教学课件
- 安全生产责任保险事故预防技术服务流程
- 新视野大学英语(第四版)读写教程1(思政智慧版) 课件 Unit 4 Social media matters Section A
- 京铁师〔2016〕408号《营业线施工安全管理实施细则》
- 宝钢3高炉微型冷却器安装工艺研究
- 燃气报警施工方案
- 上海市中考语文古诗文必背篇目汇总
- 大类资产配置量化模型研究系列之五:不同协方差矩阵估计方法对比分析
评论
0/150
提交评论