首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 9中的新关键字

Java 9中的新关键字
EN

Stack Overflow用户
提问于 2016-03-31 00:37:37
回答 5查看 9.2K关注 0票数 42

Java 9最大的特性之一将是一个由Project定义的模块系统。在阅读吉格锯工程:在罩下 at JavaOne 2015的幻灯片时,我注意到以下源代码:

代码语言:javascript
复制
// src/java.sql/module-info.java
module java.sql {
   exports java.sql;
   exports javax.sql;
   exports javax.transaction.xa;
}

这里我感兴趣的是,文件以.java结尾,似乎使用了两个新关键字:moduleexports。在Java 9中还将引入哪些其他关键字?如何处理向后兼容性(即名为module的函数或变量)?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-03-31 01:38:19

Java语言规范,Java 9版第3.9节总结了Java9中添加的模块声明关键字

另外10个字符序列是受限关键字:openmodulerequirestransitiveexportsopenstousesprovideswith。这些字符序列仅在ModuleDeclaration和ModuleDirective产品中作为终端出现时才被标记为关键字(§7.7)。为了与Java 9之前编写的程序兼容,它们被标记为其他地方的标识符。有一个例外:在ModuleDirective产品中字符序列所需的右侧,字符序列传递被标记为关键字,除非后面跟着分隔符,在这种情况下,它被标记为标识符。

如果您目前有一个名为module的方法,或者这里列出的任何其他关键字,它将继续编译。

(viewpermits是早期拼图原型中的关键词,但它们在很久以前就被简化了。)

票数 67
EN

Stack Overflow用户

发布于 2016-03-31 00:49:12

据我所知,这可能不是一个完整的清单,也没有最后确定,但我找到了一些。

我们还有moduleexportsprovidesuseswithtorequires

模块系统可以通过扫描模块工件中的类文件来识别服务的使用,以获得ServiceLoader::load方法的调用,但这既慢又不可靠。模块使用特定服务是该模块定义的一个基本方面,因此,为了提高效率和清晰度,我们在模块的声明中使用了uses子句: 模块java.sql {需要公共java.logging;要求公共java.xml;导出java.sql;导出javax.sql;导出javax.transaction.xa;使用java.sql.Driver;} 模块系统可以通过扫描元-INF/服务资源条目的模块工件来识别服务提供者,就像现在的ServiceLoader类所做的那样。然而,模块提供特定服务的实现也是同样重要的,因此,我们在模块的声明中用一个provides子句表示: 模块com.mysql.jdbc {需要java.sql;需要org.slf4j;导出com.mysql.jdbc;为java.sql.Driver提供com.mysql.jdbc.Driver;} ..。 模java.base { ..。将sun.reflect输出到java.corba、java.logging、java.sql、java.sql.rowset、jdk.scripting.nashorn;}

还有viewpermits

在大型软件系统中,定义同一个模块的多个视图通常是有用的。一个视图可以声明为其他任何模块的通用,而另一个视图则提供对内部接口的访问,这些接口仅供一组密切相关的模块使用。 例如,对于JNDI,我们希望com.sun.jndi.toolkit.url只对模块声明中指定的共命名和kerberos模块可见。 视图jdk.jndi.internal {导出com.sun.jndi.toolkit.url.*;导出sun.net.dns.*;允许jdk.cosnaming;允许jdk.kerberos; } 这样我们就有了更多的灵活性来定义模块边界。

我也听说过optional

票数 7
EN

Stack Overflow用户

发布于 2020-04-14 08:39:56

*

代码语言:javascript
复制
module mainModule @ 2.0 {

    requires A @ >= 3.0 ;   // Use version 3 or above  

    //scope:compilation,execution,reflection
    requires B for compilation optional execution;

    requires optional service S1; 
    requires static E; // need at compile time but optional at runtime 

    // let mmm requires mainModule then S2 will automatically be there for mmm
    requires transitive S2; 

    provides MI @ 2.0; 
    provides service MS with C; // provide service with impelemented class C

    exports  pack;  
    exports  pack.abc to D; //qulified export

    permits  MF;
    class    MMain;

    /*
     syntax for creating view
     view ModuleName {
         {ProvidesDir|ExportsDir|PermitsDir|EntrypointDir}
     }
   */

    view N {

        provides service NS with AD;
        exports  MA;
        permits  MB;
        class    Main;

     }
}

*看看它可能对你有帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36322223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档