java的设计者已经编写了颇有影响力的白皮书,内容摘要可以用11个关键术语进行组织:
简单性、可移植性、面向对象、解释型、网络技能、高性能、健壮性、多线程、安全性、动态性、体系结构中立,这11个术语,也可以说是官网给出的java语言带有的特性。
下面详细解释一下面试中常问的有关安全性的问题。
通常安全性问题,很广很大,不能深入研究,所以大多数安全性的发问点都是和代码安全性有关系,相关的术语有编译器、解释器、类加载器(class loader)、字节码校验器。大概的过程如下:
首先是由编译器把.java文件编译成为.class字节码文件、然后由类加载器负责把.class文件加载到Java虚拟机中,再由字节码校验器进行校验,校验通过后由Java解释器负责把该
类文件解释成为机器码进行执行。
在类加载器加载.class文件到java虚拟机的过程中,类加载器通过区分本机文件系统的类和网络系统导入的类增加安全性(不允许网络上的应用程序修改本地的数据),本机的类先被加载,一旦所有的类加载完,执行文件的内存划分就固定了,然后字节码校验器开始校验.class字节码文件,字节码校验器不检查那些可信任的编译器所产生的类文件。通过之后,java解释器材负责把类文件解释成为机器码进行执行。
我不想死记硬背,所以这里直接就粘贴字节码校验器主要执行的检查内容是什么,如果你记忆力好,那你就记,这也是一种能力:
加载的类符合JVM规范的类文件格式,没有违反访问限制,代码没有造成堆栈的上溢或者下溢,所有操作代码的参数类型都是正确的,没有非法的数据类型转换发生,检查该类文件的代码中是否存在着某些非法操作,字节码校验器在java源程序中,会执行try-catch-finally语句序列并捕捉和响应Java的程序错误。
贴一个题目把,关于Java代码安全性的叙述,哪些是正确的?
A. 字节码校验器加载查询执行需要的所有类
B. 运行时解释器执行代码
C. 在运行时,字节码被加载,验证后在解释器里面执行
D. 类加载器通过分离本机文件系统的类和从网络导入的类增加安全性