admin 管理员组

文章数量: 1086019


2024年3月21日发(作者:go语言优势)

Java中的四个核心技术思想

Java已经成为一个庞大而复杂的技术平台,对于开发人员而言,要想更好的掌

握Java技术,深入理解底层的技术处理细节必不可少。对核心概念和思想的掌

握可以帮助我们举一反三、触类旁通,有助于提升我们对整个Java平台的理解

力。这里所介绍的是Java技术平台的几个核心概念,其中所蕴含的思想有助于

我们更深刻的理解Java技术。

Java虚拟机

Java虚拟机的主要任务是装在

class文件并且执行其中的字节码。Java

虚拟机包含一个类装载器,它可以从程

序和API中装载class文件。Java API

中只有程序执行时需要的那些类才会

被装载。字节码由执行引擎来执行。

不同的Java虚拟机中,执行引擎

可能实现得非常不同。在由软件实现的

虚拟机中,最简单的执行引擎就是一次

性解释字节码。另一种执行引擎更快,

但是也更消耗内存,叫做"即时编译器

(just-in-time compiler)"。在这种情况

下,第一次被执行的字节码会被编译成

本地机器代码。编译出的本地机器代码

会被缓存,当方法以后被调用的时候可

以重用。第三种执行引擎是自适应优化

器。在这种方法里,虚拟机开始的时候

解释字节码,但是会监视运行中程序的

活动,并且记录下使用最频繁的代码

段。程序运行的时候,虚 拟机只把那些活动最频繁的代码编译成本地代码,

其他的代码由于使用得不是很频繁,继续保留为字节码-由虚拟机继续解释它们。

一个自适应的优化器可以使得Java虚拟机在80%~90%的时间里执行被优化过的

本地代码,而只需要编译10%~20%的对性能有影响的代码。

当Java虚拟机是由主机操作系统上的软件实现的时候,Java程序通过调用

本地方法(native method)和主机交互。Java中有两种方法: Java方法和本地方法。

Java方法是由Java语言编写,编译成字节码文件,存储在class文件中的。本地

方法是由其他语言(比如c,c++或汇编语言)编写的,编译成何处理器相关的机器

代码。本地方法保存在动态链接库中,格式是各个平台专有的。运行中Java程序

调用本地方法时,虚拟机装载包含这个本地方法的动态库,并调用这个方法。本

地方法是联系Java程序和底层主机操作系统的连接方法。

通过本地方法,Java程序可以直接访问底层操作系统的资源。一个本地方法

接口(Java Native Interface, JNI)-使得本地方法可以在特定主机系统的任何一个

Java平台实现上运行。

如果希望使用特定主机上的资源,它们又无法从Java API访问,那么可以写

一个平台相关的Java程序来调用本地方法。如果希望保证程序的平台无关性,

那么只能通过Java API来访问底层系统资源。

类装载器的体系结构

一个Java应用程序可以使用两种类装载器:"启动(bootstrap)"类装载器和用

户定义的类装载器。启动类装载器(这是系统中唯一的)是Java虚拟机实现的一部

分。启动类装载器通常使用某种默认方式从本地磁盘中装载类,包括Java API

类(启动类装载器也被称为原始类装载器、系统类装载器或者默认类装载器)。

Java应用程序能够在运行时安装用户定义的类装载器,这种类装载器能够使

用自定义的方式来装载类。例如,从网络下载class文件。尽管启动类装载器是

虚拟机实现的本质部分,而用户定义的类装载器不是,但用户定义的类装载器能

够用Java来编写,能够被编译成class文件,能够被虚拟机装载,还能够像其它对

象一样实例化。

由于有用户定义类装载器,所以不必再编译的时候就知道运行中的Java应

用程序中最终会加入的所有的类。用户定义的类装载器使得在运行扩展Java应

用程序成为可能。当它运行时,应用程序能够解决它需要哪些额外的类,能够决

定是使用一个或是更多的用户定义的类装载器来装载。由于类装载器是用Java

编写的,所以用任何在Java代码中可以表述的风格来进行类装载。这些类可以

通过网络下载,可以从某些数据库中获取,甚至可以动态生成。

每一个类被装载的时候,Java虚拟机都监视这个类,看到它到底是被启动类

装载器还是被用户定义类装载器装载。当被装载的类引用了另外一个类时,虚拟

机就会使用装载第一个类的类装载器装载引用的类。例如,如果虚拟机使用一个

特定的类装载器装载Volcano这个类,它就会使用这个类装载器装载Volcano类

使用的所有类。

由于Java虚拟机采取这种方式进行类的装载,所以被装载的类默认情况下

只能看到被同一个类装载器装载的别的类。通过这种方法,Java的体系结构允许

在一个Java应用程序中建立多个命名空间。运行时的Java程序中的每一个类装

载器都有自己的命名空间。

Java应用程序可以创建多少个(或多少种)被不同的类装载器装载的类存放在

不同的命名空间中,它们不能相互访问,除非应用程序显示地允许这么做。当编

写一个Java应用程序的时候,从不同源文件装载的类可以分隔在不同的命名空

间中。通过这种方法,就能够使用Java类装载器的体系结构来控制任何不同源

文件中装载的代码之间的相互影响,特别是能够阻止恶意代码获取访问或破坏善

意代码的权限。

Web浏览器是一个动态扩展的例子,Web浏览器使用用户定义的类装载器

从网络下载用于Java applet的class文件。Web浏览器使用一个用来安装用户定

义类装载器的Java应用程序。这个用户定义的类装载器通常被称为Java Applet

类装载器,它知道如何向HTTP服务器请求class文件。Java Applet可以作为动

态扩展的例子,因为Java应用程序并不知道它什么时候会开始从网络下载浏览

器请求的class文件。只有当浏览器遇到有Java applet的页面时,才决定是否需

要下载class文件。

Web浏览器启动的Java应用程序通常为每个提供class文件的网络地址分别

创建不同的用户定义类装载器,因此,不同的用户定义类装载器装载不同来源的

class文件。这就可以把它们分别放置在Java主机应用程序的不同命名空间之下。

由于不同来源的Java applet文件放置在不同的命名空间中,恶意的Java applet


本文标签: 方法 应用程序 程序 代码 使用