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。 一般来说,SYNTHETIC
和MANDATED
是Exports
中使用的修饰符,ModuleDescriptor
,{ {3}}和Opens
。这两者之间有什么区别,在实践中优先于另一个?
Q2。 如果没有在模块的源代码中声明,那么Synthetic
Modifier
的示例 >
答案 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除外。这意味着出口 在源模块声明中隐式声明。
<强>参考文献:强>