对中心概念和思想的掌握可以帮助我们举一反三、举一反三,
Java曾经成为一个庞大而复杂的技术平台, 对于开发人员而言, 深化理解底层的技术处理细节必不可少。 有助于提升我们对整个Java平台的理解力。 其中所包括的思想有助于我们更深刻的理解Java技术。 Java虚拟机包括一个类装载器, JavaAPI中只要程序执行时需要的那些类才会被装载。 执行引擎能够实现得非常不同。 最复杂的执行引擎就是一次性解释字节码。 另一种执行引擎更快, 但是也更耗费内存, 在这种情况下, 第一次被执行的字节码会被编译本钱地机器代码。 第三种执行引擎是自适应优化器。 虚拟机开始的时分解释字节码, 但是会监视运转中程序的活动, 并且记录下运用最频繁的代码段。 虚拟机只把那些活动最频繁的代码编译本钱地代码, 其他的代码由于运用得不是很频繁, 继续保留为字节码-由虚拟机继续解释它们。 而只需要编译10%~20%的对功用有影响的代码。 编译成字节码文件, c++或汇编言语)编写的, 本地方法保存在动态链接库中, 格式是各个平台专有的。 并调用这个方法。
通过本地方法, Java程序可以直接拜访底层操作系统的资源。 一个本地方法接口(JavaNativeInterface, 那么可以写一个平台相关的Java程序来调用本地方法。 假如希望保证程序的平台无关性, 那么只能通过JavaAPI来拜访底层系统资源。 启动类装载器(这是系统中唯一的)是Java虚拟机实现的一部分。 包括JavaAPI类(启动类装载器也被称为原始类装载器、系统类装载器或许默许类装载器)。 这种类装载器能够运用自定义的方式来装载类。 从网络下载class文件。 虽然启动类装载器是虚拟机实现的实质部分, 但用户定义的类装载器能够用Java来编写, 能够被虚拟机装载, 所以不用再编译的时分就晓得运转中的Java应用程序中最终会参加的一切的类。 踔量梢远伞?
每一个类被装载的时分, 看到它到底是被启动类装载器还是被用户定义类装载器装载。 虚拟机就会运用装载第一个类的类装载器装载引用的类。 例如, 假如虚拟机运用一个特定的类装载器装载Volcano这个类, 它就会运用这个类装载器装载Volcano类运用的一切类。
JAVA由于Java虚拟机采取这种方式进行类的装载, 所以被装载的类默许情况下只能看到被同一个类装载器装载的别的类。 通过这种方法, 运转时的Java程序中的每一个类装载器都有本人的命名空间。
Java应用程序可以创立多少个(或多少种)被不同的类装载器装载的类存放在不同的命名空间中, 它们不能互相拜访, 除非应用程序显示地允许这么做。 当编写一个Java应用程序的时分, 就能够运用Java类装载器的体系结构来控制任何不同源文件中装载的代码之间的互相影响, 特别是能够阻止恶意代码获取拜访或破坏好心代码的权限。
Web浏览器是一个动态扩展的例子, Web浏览器运用用户定义的类装载器从网络下载用于Javaapplet的class文件。 Web浏览器运用一个用来安装用户定义类装载器的Java应用程序。 这个用户定义的类装载器通常被称为JavaApplet类装载器, 因为Java应用程序并不晓得它什么时分会开始从网络下载浏览器请求的class文件。 因此, 不同的用户定义类装载器装载不同来源的class文件。 这就可以把它们辨别放置在Java主机应用程序的不同命名空间之下。 由于不同来源的Javaapplet文件放置在不同的命名空间中, 恶意的Javaapplet代码就不会直接拜访从别的地方下载的class文件。
Javaclass文件主要在平台无关性和网络移动性方面使Java更适宜网络。 它在平台无关性方面的义务是:为Java程序提供独立于底层主机平台的二进制形式的效劳。 然后被衔接成独自的、专门支持特定硬件平台和操作系统的二进制文件。 通常情况下, 所获得的可执行二进制文件只能在指定的硬件平台和操作系统上运转, 因为这个二进制文件包括了对目的处理器的机器言语。 而Java编译器把Java源文件的指令翻译成字节码, 这种字节码就是Java虚拟机的机器言语。
class文件设计得紧凑, 其次, 由于Java程序是动态衔接和动态扩展的, class文件可以在需要的时分才下载。 从而可以最大限度地减少终端用户的等待时间。 运转Java程序时, 虚拟机装载程序的class文件所运用的JavaAPIclass文件。 必需在这个特定平台上明白地实现API的功用。 为拜访主机上的本地资源, JavaAPI调用了本地方法。 由于JavaAPIclass文件调用了本地方法, Java程序就不需要再调用它们了。 通过这种方法, JavaAPIclass文件为底层主机提供了具有平台无关性、标准接口的Java程序。 无论平台外部如何, Java程序自身就能够成为具有平台无关性的程序。 当JavaAPI的方法进行任何有潜在危险的操作(比如进行本地磁盘写操作)之前, 该类用来执行栈检验, 已决定能否允许某种操作。