Wil*_*ood 36 java syntax java-platform-module-system java-9
Java 9最大的功能之一将是Project Jigsaw定义的模块系统.在阅读Project Jigsaw:在 JavaOne 2015 的Hood下阅读幻灯片时,我注意到以下源代码:
// src/java.sql/module-info.java
module java.sql {
exports java.sql;
exports javax.sql;
exports javax.transaction.xa;
}
Run Code Online (Sandbox Code Playgroud)
这里有趣的是文件结尾.java并且似乎使用了两个新的关键字:module,和exports.Java 9中将引入哪些其他关键字?如何处理向后兼容性(即命名的函数或变量module)?
Mar*_*old 64
为Java 9中的模块声明添加的关键字在Java语言规范,Java SE 9 Edition的 §3.9中进行了总结:
进一步的十个字符的序列被限制关键字:
open,module,requires,transitive,exports,opens,to,uses,provides,和with.这些字符序列仅被标记为关键字,它们在ModuleDeclaration和ModuleDirective制作中作为终端出现(第7.7节).它们在其他地方被标记为标识符,以便与Java SE 9之前编写的程序兼容.有一个例外:在ModuleDirective生产中,字符序列的右侧需要将字符序列传递标记为关键字,除非它是后跟一个分隔符,在这种情况下,它被标记为一个标识符.
如果您目前有一个名为的方法module,或此处列出的任何其他关键字,它将继续编译.
(view并且permits是早期Jigsaw原型中的关键字,但很久以前它们就被简化了.)
这可能不是一个完整的清单,根据我的知识,这些都没有最终确定,但我发现了一些.
我们也有module,exports,provides,uses,with,to,和requires; 在这里解释:
模块系统可以通过扫描模块工件中的类文件来识别ServiceLoader :: load方法的调用来识别服务的使用,但这既慢又不可靠.模块使用特定服务是该模块定义的一个基本方面,因此为了效率和清晰度,我们在模块的声明中用uses子句表示:
Run Code Online (Sandbox Code Playgroud)module java.sql { requires public java.logging; requires public java.xml; exports java.sql; exports javax.sql; exports javax.transaction.xa; uses java.sql.Driver; }模块系统可以通过扫描META-INF /服务资源条目的模块工件来识别服务提供者,就像ServiceLoader类今天所做的那样.但是,模块提供特定服务的实现同样是基础,因此我们在模块的声明中用provide子句表示:
Run Code Online (Sandbox Code Playgroud)module com.mysql.jdbc { requires java.sql; requires org.slf4j; exports com.mysql.jdbc; provides java.sql.Driver with com.mysql.jdbc.Driver; }...
Run Code Online (Sandbox Code Playgroud)module java.base { ... exports sun.reflect to java.corba, java.logging, java.sql, java.sql.rowset, jdk.scripting.nashorn; }
还view和permits:
在大型软件系统中,定义同一模块的多个视图通常很有用.一个视图可以被声明为任何其他模块的一般用途,而另一个视图提供对内部接口的访问,这些内部接口仅供选择的一组密切相关的模块使用.
例如,对于JNDI,我们希望com.sun.jndi.toolkit.url仅对cosnaming和kerberos模块可见,如模块声明中所指定.
Run Code Online (Sandbox Code Playgroud)view jdk.jndi.internal { exports com.sun.jndi.toolkit.url.*; exports sun.net.dns.*; permits jdk.cosnaming; permits jdk.kerberos;}
这样我们就可以更灵活地定义模块边界.
我也听说过optional.
| 归档时间: |
|
| 查看次数: |
5219 次 |
| 最近记录: |