Java9中的Synthetic和Mandated Modifier有什么区别

时间:2017-09-18 05:48:31

标签: java java-9 java-module module-info

java doc中的Modifier for Exports表示

  

MANDATED导出在模块的源中隐式声明   声明。

     

SYNTHETIC   出口没有明确或隐含地声明   模块声明。

看一些module-info.class es,我可以看到通常有两种类型的用法:

module java.base {
    ...
    exports java.util; // type 1
    exports java.util.concurrent;
    exports java.util.concurrent.atomic;
    exports jdk.internal to jdk.jfr; // type 2
    exports jdk.internal.jmod to
        jdk.compiler,
        jdk.jlink;
    ...
}

Qualified Exports确实描述了这两种类型,但没有引用枚举类型。这些是文档中提到的不同类型吗?

Q1。 一般来说,SYNTHETICMANDATEDExports中使用的修饰符,ModuleDescriptor,{ {3}}和Opens。这两者之间有什么区别,在实践中优先于另一个?

Q2。 如果没有在模块的源代码中声明,那么Synthetic Modifier的示例 >

1 个答案:

答案 0 :(得分:1)

Synthetic和Mandated修饰符的区别很简单 - 隐式声明了赋值,并且没有隐式或显式声明合成。有很好的文章和java规范有关于合成修饰符的详细解释,这是前面介绍给java的。由于细节的完整性,下面从合成中提取出与合成有关的细节。请在最后找到参考文献。

合成

  

Synthetic属性是属性中的固定长度属性   ClassFile,field_info或method_info结构的表(§4.1,   §4.5,§4.6)。未出现在源代码中的类成员   必须使用Synthetic属性进行标记,否则必须使用它   ACC_SYNTHETIC标志设置。这个要求的唯一例外是   编译器生成的方法,不被视为实现   工件,即表示一个的实例初始化方法   Java编程语言的默认构造函数(第2.9节),类   初始化方法(第2.9节),以及Enum.values()和Enum.valueOf()   方法。 Java合成类,方法和字段适用于java   运行时的内部用途。我们可能不需要了解   他们写代码。

     

Synthetic属性是在JDK 1.1版中引入的,以支持   嵌套类和接口。

     

Synthetic属性具有以下格式:

Synthetic_attribute {
    u2 attribute_name_index;
    u4 attribute_length;
}
     

Synthetic_attribute结构的项目如下:

     

attribute_name_index attribute_name_index项的值必须   是一个有效的constant_pool表索引。 constant_pool条目   在该索引处必须是CONSTANT_Utf8_info(§4.4.7)结构   表示字符串“Synthetic”。

     

attribute_length attribute_length项的值为零。用途   Java Synthetic的结果•当我们调试会话时,它可能很有用   在堆栈跟踪中看到那些合成的东西,我们可以理解它是什么。   •AOP,泛型,枚举使用Java合成。 •Java反射API   公开方法以检查元素是否是合成的。 •常规java   应用程序员不需要日常使用合成   节目。 •面试时可能需要这方面的知识   并不强制要求您在项目中使用它。合成时   产生的?封闭类访问a的私有属性时   嵌套类,Java编译器为此创建合成方法   属性。如果源中有getter方法,那么这个   不会创建合成方法。同样的构造函数   内部类也是合成的。有很多场合,   像这样创建合成字段或方法或类。

已获授权的:

  

在模块的源代码中隐式声明了opens包   宣言。这种依赖性在模块声明中声明。一个   强制构造是未明确声明的构造   源代码,但其存在是规范要求的。这样   据说一个构造是隐式声明的。一个例子   mandated元素是包含no的类中的默认构造函数   显式构造函数声明。强制命令的另一个例子   construct是用于保存的隐式声明的容器注释   可重复注释类型的多个注释。例如:

 Module claim
 requires mandated java.base
     

第1行。定义名为claim的模块。第2行定义了每一个   模块依赖java.base模块,java.base除外。这意味着出口   在源模块声明中隐式声明。

<强>参考文献: