Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
你可以选择 seal (密封) 扩展 JAR 文件中的包作为附加安全措施。如果密封包,则该包中定义的所有类必须来自单个 JAR 文件。
如果没有密封,“恶意”程序可以创建一个类并将其定义为你的一个扩展包的成员。然后恶意软件可以免费访问扩展包的受包保护的成员。
密封扩展中的与密封任何 JAR 包装的类没有什么不同。要密封扩展包,必须将 Sealed 头添加到包含扩展的 JAR 文件的清单中。你可以通过将 Sealed 头与软件包的 Name 头相关联来密封单个软件包。与归档中的单个包无关的 Sealed 头表示所有包都已密封。这样的“全局”Sealed 头被与各个包相关联的任何 Sealed 头覆盖。与 Sealed 头关联的值为 true 或 false。
我们来看一些示例清单文件。对于这些示例,假设 JAR 文件包含以下这些包:
com/myCompany/package_1/ com/myCompany/package_2/ com/myCompany/package_3/ com/myCompany/package_4/
假设你要密封所有包裹。你可以通过简单地将清单级 Sealed 头添加到清单中来执行此操作,如下所示:
Manifest-Version: 1.0 Sealed: true
具有此清单的任何 JAR 文件中的所有包都将被密封。
如果你只想密封 com.myCompany.package_3,可以使用此清单进行密封:
Manifest-Version: 1.0 Name: com/myCompany/package_3/ Sealed: true
在此示例中,唯一的 Sealed 头是与包 com.myCompany.package_3 的 Name 头关联的,因此只有该软件包被密封。(Sealed 头与 Name 头关联,因为它们之间没有空行。)
最后一个例子,假设你要密封所有包 除了 com.myCompany.package_2。你可以使用这样的清单来完成它:
Manifest-Version: 1.0 Sealed: true Name: com/myCompany/package_2/ Sealed: false
在此示例中,归档级 Sealed: true 头指示要密封 JAR 文件中的所有包。但是,清单还有一个与 com.myCompany.package_2 包相关联的 Sealed: false 头,该头会覆盖该软件包的存档级密封。因此,此清单将导致除了 com.myCompany.package_2 之外,密封所有包。