java技术提供以下三种机制确保安全:

1、语言设计特性(对数组的边界进行检查,只进行合法的类型转换,无指针算法等)

2、访问控制机制,用户控制代码能够执行的功能(比如文件访问、网络访问等)

3、代码签名,利用该特性,代码的作者就能够用标准的加密算法来标明java代码的身份。这样,该代码的使用者就能准确的知道谁创建了该代码,以及代码被标识后是否被修改过。

java虚拟机负责检查不良指针、无效的数组偏移量等。为了控制进入虚拟机的信息,还需要采取其它步骤。

当类文件加载到虚拟机中时,要检查其完整性。

为了获得最大的安全性,无论加载类的默认机制,还是自定义的类加载器,都需要与负责控制代码运行的安全管理器类协同工作。

类加载器

虚拟机只加载程序执行时所需要的类文件。例如,程序从***.class开始执行,虚拟进执行的步骤为:

1、虚拟机有一个用于加载类文件的机制(例如,从磁盘上读取文件或者从web上请求文件;使用该机制来加载***类文件的内容)

2、如果***类拥有类型为另一个类的实例变量,或着拥有超类,那么这些类也会被加载(加载某个类所依赖的所有类的过程称为类的解析)

3、接着,执行***类中的main方法(该方法是静态的,无需创建类的实例)

4、如果main方法或者main调用的方法要用到更多的类,接下来就会加载这些类

类加载机制并非只使用单个的类加载器。每个java程序至少拥有三个类加载器:

1、引导类加载器

2、扩展类加载器

3、系统类加载器(有时也称应用类加载器)

引导类加载器负责加载系统类(通常从jar文件rt.jar中进行加载)。是虚拟机整体中的一部分,通常用c语言来实现。引导类加载器没有对应的ClassLoader对象。

扩展类加载器用于从jre/lib/ext目录加载“标准的扩展”。可以把jar文件放入该目录,这样即使没有任何类路径,扩展类加载器也可以找到其中的各个类。

系统类加载器用于加载应用类。它在由CLASSPATH环境变量或者-classpath命令行选项设置的类路径中的目录里或者是jar/zip文件里查找这些类。

扩展类加载器和系统类加载器都是用java实现的,是URLClassLoader类的实例。

类加载器中有一种父/子关系。除了引导类加载器外,每个类加载器都有一个父类加载器。根据规定,类加载器会为它的父类加载器提供一个机会,以

便加载任何给定的类。并且只有在其父类加载器加载失败时,它才会加载该给定类。

注意:当实现一个类加载器时,应该总是将类的加载操作委托给父类加载器来执行。这样做的一个潜在风险是,自定义的类加载器有可能会意外的加载某个系统类的某个版本,而绕过了重要的安全检查。