这些Java教程是为JDK 8编写的。本页描述的示例和实践不利用后续版本引入的改进,并且可能使用不再可用的技术。
有关Java SE 9及以后版本中更新的语言功能的摘要,请参阅Java语言变更。
有关所有JDK版本的新功能、增强功能以及已删除或弃用选项的信息,请参阅JDK发布说明。
你可以选择将扩展JAR文件中的包封装起来,作为一种额外的安全措施。如果一个包被封装了,那么在该包中定义的所有类必须来源于同一个JAR文件。
如果没有封装,一个“敌对的”程序可以创建一个类,并将其定义为你的扩展包的成员。这个敌对软件将可以自由访问你的扩展包的包级私有成员。
在扩展中封装包与封装任何JAR包中的类没有区别。要封装你的扩展包,你必须在包含扩展的JAR文件的清单中添加Sealed头。你可以通过将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之外的所有包都被封装。