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

2022-09-03 02:59:27

java 文档中的导出修饰符指出

授权导出是在模块声明的源中隐式声明的。

合成导出未在模块声明的源中显式或隐式声明。

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

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;
    ...
}

合格导出确实描述了这两种类型,但没有对枚举类型的引用。这些是文档中引用的不同类型的类型吗?

问题 1.通常,是用于导出模块描述符打开要求中使用的修饰符。这两者之间有什么区别,在实践中,一个比另一个更可取?SYNTHETICMANDATED

问题 2.如果未在模块的源代码中声明,则无论如何,示例是什么?SyntheticModifier


答案 1

合成修饰符和授权修饰符的区别很简单 - 授权是隐式声明的,合成不是隐式或显式声明的。关于这一点有很好的文章,java规范有关于合成修饰符的详细说明,这是早期引入java的。由于细节的完整性,从中提取了以下与合成材料有关的细节。请在末尾找到参考资料。

合成:

综合属性是类文件、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_attribute {
    u2 attribute_name_index;
    u4 attribute_length;
}

Synthetic_attribute结构的项如下所示:

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

attribute_length attribute_length项的值为零。Java Synthetic的使用•它可能在调试会话中很有用,当我们在堆栈跟踪中看到这些合成的东西时,我们可以理解它是什么。• AOP、泛型、枚举使用 Java 合成。• Java 反射 API 公开了检查元素是否合成的方法。• 普通的Java应用程序程序员不需要合成的日常编程。•这些知识可能是面试中需要的,但这并不意味着您将在项目中使用它。合成材料是什么时候产生的?当封闭类访问嵌套类的私有属性时,Java 编译器将为该属性创建综合方法。如果源代码中有可用的 getter 方法,则不会创建此合成方法。同样,对于内部类的构造函数,也创建了合成。在许多情况下,例如,创建合成字段或方法或类。

授权:

打开的包是在模块声明的源中隐式声明的。此依赖项已在模块声明中声明。强制构造是未在源代码中显式声明的构造,但其存在由规范强制要求的构造。这种结构被称为隐式声明的。强制元素的一个示例是不包含显式构造函数声明的类中的默认构造函数。强制构造的另一个示例是隐式声明的容器注释,用于保存可重复注释类型的多个注释。前任:

 Module claim
 requires mandated java.base

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

引用:


答案 2

推荐