仓酷云
标题:
JAVA编程:静态编译JAVA程序
[打印本页]
作者:
若相依
时间:
2015-1-18 11:43
标题:
JAVA编程:静态编译JAVA程序
但是对于JAVA技术类的学习,我觉得大课堂反而会影响自身独立思考的过程,因为上课的时候,老师讲课的速度很快为了不遗漏要点,通常会仔细的听,编译|程序|静态在SunJDK1.2及后续版本中,包括了一组可在程序运转时候编译和实行Java代码的API。这些API被包括在tools.jar类库中。这个功效同意Java程序在运转时静态编译、实行小的代码块,在有些情形下这个功效会让Java使用程序的架构加倍天真、开放。
本文假定读者已在盘算机中安装并设置好了SunJDK1.2或更高的版本,并对javac编译器命令有所懂得。
在Java程序中利用编译器
假定要利用javac命令编译/home/mytest目次下Test.java文件,并设定class文件寄存在/home/mytest/classes路径下,输出上面命令:
javac-d/home/mytest/classesTest.java
到达一样的目标,也能够利用Sun供应的一个Java编译器的API来完成。它的利用也很复杂,中心代码段以下:
…
String[]args=newString[]{“-d”,“/home/mytest/classes”,“Test.java”};
Intstatus=javac.compile(args);
…
javac编译工具被安装在JDK根目次的/bin目次下,卖力将源代码编译成运转于JVM的字节码。现实上,我们常常利用/bin目次下的javac编译工具来编译Java源文件。假如在Java程序中静态编译恣意制订的Java语句,利用这个内部的javac编译器就显得不敷天真了。固然偶然可以使用Runtime类来实行一个内部命令,但假如想晓得代码是不是被编译经由过程、编译时产生了甚么毛病,用Runtime类的exec()办法就很难完成了。
在Sun的JDK1.2及后续版本中,JDK安装路径的/lib路径下包括了一个tools.jar文件,这个类库包括了一个完全的编译器包。com.sun.tools.javac.Main是编译器的主类出口,假如已熟习了javac编译器命令行的利用办法,很简单了解这个类的利用办法。办法compile(String[]p)实行编译举措,参数p是一个String数组,用来寄存javac命令的参数选项,编译后的形态前往一个Int值,其对应值参考以下表所示:
表形态参数与对应值
EXIT_OK0
EXIT_ERROR1
EXIT_CMDERR2
EXIT_SYSERR3
EXIT_ABNORMAL4
在程序实行时编译和实行Java语句
从下面一段中,我们已基础懂得了静态编译一个Java文件的办法。那末,怎样运转时静态编译指定的Java语句呢?这里必要一个技能。
假定要静态编译的Java条语句以下:
System.out.println(“Hello,Thisruntimecode!”);
编译器不撑持编译单个Java语句,被编译的对象必需是一个以.java为后缀的、布局正当的类源程叙文件,以是必要对这个语句举行改革,酿成一个完全的类,并把这条语句置进main办法中,便于测试。
publicclass<一时类文件名>{
publicstaticvoidmain(String[]args)throwsException{
System.out.println(“Hello,Thisruntimecode!”);
}
}
如许,欲静态编译的代码已被程序静态拼装成了下面那段代码,筹办事情还没有停止,不外看起来事情在趋势略微的庞大化。由于上述代码以后还寄存在内存中,编译器仿佛对一个硬盘文件更感乐趣。我们必要援用java.io.File类(JDK1.2以上),创立一个一时的文件来寄存上述代码的内容。java.io.File类的静态办法createTempFile()办法包管所创立的文件名是不反复的,如许会增年夜这段程序的天真性。天真性取决于真正使用到体系架构中的战略。
System.getProperty(“user.dir”)用来取得以后路径,在这里作为一时文件的寄存目次。
Filefile;
file=File.createTempFile(“JavaRuntime”,“.java”,newFile(System.getProperty(“user.dir”)));
Stringfilename=file.getName();
Stringclassname=getClassName(filename);
//将代码输入到文件
PrintWriterout=newPrintWriter(newFileOutputStream(file));
out.println(“publicclass”+classname+“{”};
out.println(“..代码..”);
out.println(“}”);
//封闭文件流
out.flush();
out.close();
我们商定被创立的一时文件名以“JavaRuntime”为头缀(可恣意定名),后缀名以“.java”开头。一个待编译的Java源文件已主动态天生。下一步要从com.sun.tools.javac包中创立一个Main实例,挪用javac.compile()办法编译这个一时文件:
Privatestaticcom.sun.tools.javac.Mainjavac=newcom.sun.tools.javac.Main();
String[]args=newString[]{“-d”,System.getProperty(“user.dir”),filename};
Intstatus=javac.compile(args);
假定一时文件经由过程了编译器文法考证等考证,编译乐成(status值即是0,参看前表),在以后程序的运转目次下就会多了一个Java类文件。我们将经由过程实行这个Java类文件,来摹拟实行欲静态编译代码的了局。
Java供应在运转时候加载类的特征,可静态辨认和挪用类机关办法、类字段和类办法。java.lang.reflect.Method完成了Member接口,能够挪用接口的办法来取得办法类的称号、润色词等。办法getRuturnType()、getParameterTypes()、getExeptionTypess()等前往被暗示办法的机关信息。Method另外一个主要的特征是能够挪用invoke()实行这个办法(具体利用办法能够检察java.lang.reflect包文档)。上面这段代码中创立一个java.lang.reflect.Method类办法,挪用getMethod()办法取得被拼装的main办法的映照,这段代码以下:
try{
//会见这个类
Classcls=Class.forName(classname);
//挪用main办法
Methodmain=cls.getMethod(“main”,newClass[]{String[].class});
main.invoke(null,newObject[]{newString[0]});
}catch(SecurityExceptionse){
debug(“accesstotheinformationisdenied:”+se.toString());
}catch(NoSuchMethodExceptionnme){
debug(“amatchingmethodisnotfoundorifthennameisor:
”+nme.toString());
}catch(InvocationTargetExceptionite){
debug(“Exceptioninmain:”+ite.getTargetException());
}catch(Exceptione){
debug(e.toString());
}
运转了局参以下:
Hello,Thisruntimecode!
树模程序
上面给出了一个复杂的Java程序,这个程序申明了怎样使用Sun的javac编译器完成静态编译Java语句。运转该程序必要盘算机安装JDK1.2以上版本,并在classpath中或运转时指定tools.jar文件地位。
程序布局:
◆compile()编译Java代码,前往天生的一时文件;
◆run()运转编译的class文件;
◆debug()输入调试信息;
◆getClassName()从一个Java源文件取得类名;
◆readLine()从把持台读取用户输出的JavaCode。
Importjava.io.File;
…
PublicclassRuntimeCode{
/**编译器*/
privatestaticcom.sun.tools.javac.Mainjavac=newcom.sun.tools.javac.Main();
/**守候用户输出JavaCode,然后编译、实行*/
publicstaticvoidmain(String[]args)throwsException{
…
run(compile(code));
}
/**编译JavaCode,前往一时文件对象*/
privatesynchronizedstaticFilecompile(Stringcode)
throwsIOException,Exception{
Filefile;
//在用户以后文件目次创立一个一时代码文件
file=File.createTempFile(“JavaRuntime”,“.java”,
newFile(System.getProperty(“user.dir”)));
//当假造机加入时,删除此一时java源文件
file.deleteOnExit();
//取得文件名和类名字
Stringfilename=file.getName();
Stringclassname=getClassName(filename);
//将代码输入到文件
PrintWriterout=newPrintWriter(newFileOutputStream(file));
out.println(“/**”);
…
//封闭文件流
out.flush();
out.close();
//编译代码文件
String[]args=newString[]{“-d”,System.getProperty(“user.dir”),filename};
//前往编译的形态代码
intstatus=javac.compile(args);
//处置编译形态
…
}
/**实行方才编译的类文件*/
privatestaticsynchronizedvoidrun(Filefile)
…
//当假造机加入时,删除此一时编译的类文件
newFile(file.getParent(),classname+“.class”).deleteOnExit();
try{
//会见这个类
Classcls=Class.forName(classname);
//映照main办法
Methodmain=cls.getMethod(“main”,newClass[]{String[].class});
//实行main办法
main.invoke(null,newObject[]{newString[0]});
}catch(SecurityExceptionse){
…
}
}
/**打印调试信息*/
privatestaticvoiddebug(Stringmsg){
System.err.println(msg);
}
/**依据一个java源文件名取得类名*/
privatestaticStringgetClassName(Stringfilename){
returnfilename.substring(0,filename.length()-5);
}
/**从把持台取得用户输出的Java代码段*/
…
}
编译运转上述代码,在pleaseinputjavacode提醒下输出以下代码:
for(inti=0;i<10;i++){System.out.println(“thisis:”+i);}
运转了局以下所示:
Pleaseinputjavacode:
for(inti=0;i<10;i++){System.out.println(“thisis:”+i);}
wait....
--------------------
thisis:0
thisis:1
thisis:2
thisis:3
thisis:4
thisis:5
thisis:6
thisis:7
thisis:8
thisis:9
总结
在年夜中型企业使用体系平台中,利用代码静态编译手艺分离OO编程模子,可在体系不菪机前提下包管体系的可扩大性和伸缩性。假如你是一个Java程序员,略加调剂以上代码,还能够匡助调试小段的Java代码.
对于一个大型项目,如果用java来作,可能需要9个月,并且可能需要翻阅10本以上的书,但如果用ruby来作,3个月,3本书就足够了,而.net也不过3,4本书足以,这就是区别。
作者:
简单生活
时间:
2015-1-21 13:04
是一种使用者不需花费很多时间学习的语言
作者:
小女巫
时间:
2015-1-30 18:52
是一种突破用户端机器环境和CPU
作者:
蒙在股里
时间:
2015-2-6 15:03
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
作者:
小魔女
时间:
2015-2-6 22:07
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
作者:
变相怪杰
时间:
2015-2-10 04:20
是一种语言,用以产生「小应用程序(Applet(s))
作者:
精灵巫婆
时间:
2015-2-19 07:42
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
作者:
admin
时间:
2015-2-25 21:29
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
作者:
不帅
时间:
2015-3-5 22:47
你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。
作者:
飘灵儿
时间:
2015-3-11 12:09
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
作者:
活着的死人
时间:
2015-3-12 05:38
《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。
作者:
老尸
时间:
2015-3-19 18:17
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
作者:
柔情似水
时间:
2015-3-28 21:16
是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
作者:
深爱那片海
时间:
2015-3-31 12:45
是一种将安全性(Security)列为第一优先考虑的语言
作者:
第二个灵魂
时间:
2015-3-31 17:55
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
作者:
兰色精灵
时间:
2015-4-11 17:20
是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言
作者:
仓酷云
时间:
2015-4-19 09:52
你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。
作者:
再见西城
时间:
2015-4-21 00:32
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
作者:
灵魂腐蚀
时间:
2015-4-23 06:17
所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
作者:
再现理想
时间:
2015-4-29 07:53
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2