仓酷云

标题: 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