(转)Java 程序的执行过程

本文介绍Java程序从编译到执行的全过程,包括虚拟机如何解析Java源代码生成字节码,以及字节码如何被加载、验证并最终执行。此外,还详细说明了Java虚拟机(JVM)的工作原理及其如何确保程序的可移植性和安全性。

首先编译:虚拟机会根据java预言的规则进行语法分析,词法分析,语义分析等等,以及类变量常量的提取等等,然后依据class文件的格式把程序转化为字节码文件。这就是你用javac命令的结果。
运行:要经过装载———》链接——》初始化的步骤,进入内存(分配空间,初始化变量方法区,常量池,堆栈等等),然后在用到的时间就从main方法入口区执行程序!这里面的每一个步骤都是很复杂的过程

 

 

---->Java应用程序的开发周期包括编译、下载、解释和执行几个部分。Java编译程序将Java源程序翻译为JVM可执行代码--字 节码。这一编译过程同C/C++的编译有些不同。当C编译器编译生成一个对象的代码时,该代码是为在某一特定硬件平台运行而产生的。因此,在编译过程中, 编译程序通过查表将所有对符号的引用转换为特定的内存偏移量,以保证程序运行。Java编译器却不将对变量和方法的引用编译为数值引用,也不确定程序执行 过程中的内存布局,而是将这些符号引用信息保留在字节码中,由解释器在运行过程中创立内存布局,然后再通过查表来确定一个方法所在的地址。这样就有效的保 证了Java的可移植性和安全性。

      运行JVM字节码的工作是由解释器( java命令 )来完成的。解释执行过程分三部进行:代码的装入、代码的校验和代码的执行。装入代码的工作由"类装载器"(class loader)完成。类装载器负责装入运行一个程序需要的所有代码,这也包括程序代码中的类所继承的类和被其调用的类。当类装载器装入一个类时,该类被放 在自己的名字空间中。除了通过符号引用自己名字空间以外的类,类之间没有其他办法可以影响其他类。在本台计算机上的所有类都在同一地址空间内,而所有从外 部引进的类,都有一个自己独立的名字空间。这使得本地类通过共享相同的名字空间获得较高的运行效率,同时又保证它们与从外部引进的类不会相互影响。当装入 了运行程序需要的所有类后,解释器便可确定整个可执行程序的内存布局。解释器为符号引用同特定的地址空间建立对应关系及查询表。通过在这一阶段确定代码的 内存布局,Java很好地解决了由超类改变而使子类崩溃的问题,同时也防止了代码对地址的非法访问。

     随后,被装入的代码由字节码校验器进行检查。校验器可发现操作数栈溢出,非法数据类型转化等多种错误。通过校验后,代码便开始执行了。

---->相关概念:

JVM Java Virtual Machine(Java虚拟机),的。 Java虚拟机有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只 需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,实际上最终还是把字节码解释成具 体平台上的机器指令执行。

### Java库用于将DOCX、DOC和PDF文件换为HTML #### 使用JODConverter进行换 JODConverter是一个流行的开源工具,它利用LibreOffice/OpenOffice作为后台服务来执行文档格式之间的换。通过调用LibreOffice的API,可以轻松地将`.doc`或`.docx`文件换为HTML。具体实现方式如下: ```java import org.artofsolving.jodconverter.OfficeDocumentConverter; import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration; public class DocToHtmlConverter { public static void main(String[] args) throws Exception { DefaultOfficeManagerConfiguration config = new DefaultOfficeManagerConfiguration(); config.setOfficeHome("/path/to/libreoffice"); OfficeDocumentConverter converter = new OfficeDocumentConverter(config.build()); converter.convert(new java.io.File("input.doc"), new java.io.File("output.html")); } } ``` 此代码片段展示了如何配置并运行JODConverter以完成从`.doc`到HTML的换[^1]。 #### 利用Docx4j处理Word至HTML的换 对于更复杂的场景或者需要更高性能的应用程序来说,可以选择使用Docx4j这个专门针对Microsoft Word XML (.docx) 文件设计的强大框架来进行换操作。下面是一段简单的例子展示其基本功能: ```java import org.docx4j.Docx4J; import org.docx4j.openpackaging.packages.WordprocessingMLPackage; public class DocxToHtmlExample { public static void main(String[] args) throws Exception { WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load( new java.io.FileInputStream("test.docx")); Docx4J.toHTML(wordMLPackage, System.out); } } ``` 上述示例说明了加载一个现有的 `.docx` 文档并通过标准输出流将其保存成 HTML 的过程[^2]。 #### Apache PDFBox解析PDF为HTML 当涉及到把PDF化为HTML的时候,Apache PDFBox提供了一种解决方案。虽然直接支持有限,但是可以通过提取文本内容再构建相应的标记结构达到目的。这里给出一段基础示范代码: ```java import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.text.PDFTextStripper; public class PdfToHtmlConverter { public static void main(String[] args) throws Exception { PDDocument document = null; try { document = PDDocument.load(new java.io.File("example.pdf")); PDFTextStripper stripper = new PDFTextStripper() { protected void writeString(String string, List<TextPosition> textPositions) throws IOException{ super.writeString(string.replaceAll("\n", "<br />").replaceAll(" ", "&nbsp;"),textPositions ); } }; String content = stripper.getText(document); // Write the extracted content into an HTML file. java.nio.file.Files.write(java.nio.file.Paths.get("output.html"), ("<html><body>" + content + "</body></html>").getBytes(), java.nio.file.StandardOpenOption.CREATE); } finally { if( document != null ){ document.close(); } } } } ``` 该脚本读取了一个名为 `example.pdf` 的文件,并尝试将其中的内容写入一个新的叫做 `output.html` 的网页文件里去[^3]。 #### 总结 每一种技术都有各自的优缺点,在实际项目开发过程中可以根据需求灵活选用合适的方案。如果追求简单易用性和跨平台兼容性,则推荐采用基于 LibreOffice 的 JODConverter;而对于高度定制化的需求而言,像 Docx4j 和 Apache PDFBox 这样的专用类库可能更加适合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值