我正在学习Java语言规范,我对"Observability of a Package"在JLS§7.4.3 -包的可观测性中的意义有一个问题
一个包是可观察的当且仅当:
我的问题是
A subpackage of the package is observable发布于 2015-08-08 12:34:07
JLS中有四个概念,准确地说是很好的:
( 1)编译单元是可观测的;2)编译单元总是可观测的;3)包是可观测的,4)包总是可观测的
( 1)假设编译单元"A“是可观察的。这意味着Java编译器可以找到这个编译单元并解析/编译其内容。
2)如果任何独立于其属性的编译过程都能找到并解析/编译该编译单元,则编译单元始终是可观察的。通常编译单元都是由Java实现者提供的,这些单元总是可以观察到的。
( 3)包是可观测的当且仅当该包至少有一个可观测的编译单元或至少有一个可观测的子包。另外,我想指出的是,包仍然可以包含无法观察到的编译单元或子包。
4)包总是可观测的当且仅当该包中至少有一个编译单元总是可观测的,或者至少有一个始终可观测的子包。通常,总是可观察的子包由Java实现者提供。另外,我想指出的是,包仍然可以包含无法观察到的编译单元或子包。
发布于 2015-08-08 14:36:13
这是我先前的答覆的延续。
让我们考虑上述四个概念如何与Oracle的"Java 8“的实现相关。
首先,编译单元是简单的文件,包是本地文件系统的文件夹。
( 1)我们如何使特定的汇编单元在特别是遵守情况下可以观察到?为此,我们使用并枚举编译,并将它们与空格分隔开来。
例如,如果当前文件夹为D:\fo1\Foo2 2,则编写
javac com\my1\MyClass1.java com\my2\MyClass2.java
我们编译了两个编译代码:d:\Foo1 1\Foo1 2\com\my1\MyClass1.java D:\Foo1 1\Foo1 2\com\myC.2\MyClass2.java
此外,我们还可以使用以下选项修改编译: 1) javac编译器的"-sourcepath“选项。2) javac编译器的"-classpath“或"-cp”选项。3) "CLASSPATH“环境变量。
有关更多详细信息,请参阅http://docs.oracle.com/javase/8/docs/technotes/tools/windows/javac.html。
另外,我想指出的是,"-sourcepath“只搜索编译单元,但是"-classpath”(或-cp)和“CLASSPATH”不仅可以搜索编译单元,还可以搜索编译Java类(*.class文件),这些类可以随意地捆绑在jar/zip文件中。这些编译类现在不是编译单元,而是编译前的编译单元。我们可以将它们视为“修改”编译单元或以前执行某些过程的编译单元。因此,通过上述三个选项,我们可以在特定编译中添加更多的编译单元。
2)始终可以观察到的编译单元与"Java 8“的安装捆绑在一起,并位于"...\jdk1.8.0_51\jre\lib”中。它们中的大多数都被放置在众所周知的"rt.jar“中。但是放在其他jars中的编译单元也总是可以观察到的。如您所见,它们被打包成jar文件中的编译类文件,因此它们是“修改”的编译单元。
3)如果你浏览一下"...\jdk1.8.0_51\jre\lib“,你会发现很多经常可以观察到的软件包:
java -根据规范总是可以观察到的
java.lang -根据规范总是可以观察到的
java.io -根据规范总是可以观察到的
java.applet
java.awt
java.beans
java.math
java.net
java.nio
java.rmi
java.security
java.sql
java.text
java.time
java.util
.
此外,你也可以把你自己的小伙伴放到"...\jdk1.8.0_51\jre\lib\ext“里,这样你就可以观察到你的小人。
https://stackoverflow.com/questions/23032904
复制相似问题