什么';在Java9中,合成修饰语和强制修饰语的区别是什么

什么';在Java9中,合成修饰语和强制修饰语的区别是什么,java,java-9,java-module,module-info,Java,Java 9,Java Module,Module Info,java文档中的 导出是在模块的源中隐式声明的 声明 导出未在源中显式或隐式声明 模块声明 查看一些模块info.classes,我可以看到通常有两种用法: module java.base { ... exports java.util; // type 1 exports java.util.concurrent; exports java.util.concurrent.atomic; exports jdk.internal to jdk.jfr

java文档中的

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

导出未在源中显式或隐式声明 模块声明

查看一些
模块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;
    ...
}
确实描述了这两种类型,但没有对枚举类型的引用。这些是文件中提到的不同类型吗

Q1.一般来说,合成的
和强制的
是中使用的修饰符,和。这两者之间的区别是什么?在实践中,一个优先于另一个吗


Q2.如果模块源代码中未声明,
合成的
修饰符
的示例是什么?

合成修饰符和强制修饰符的区别很简单-强制修饰符是隐式声明的,而合成修饰符不是隐式或显式声明的。关于这方面有很多好文章,java规范详细解释了早期引入java的合成修饰符。由于细节的完整性,以下与合成产品相关的细节是从这些细节中提取出来的。请在末尾找到参考资料

合成的:

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

JDK 1.1版中引入了合成属性以支持 嵌套类和接口

合成属性具有以下格式:

Synthetic_attribute {
    u2 attribute_name_index;
    u4 attribute_length;
}
合成_属性结构的项目如下所示:

属性名称索引属性名称索引项的值必须 是常量池表的有效索引。常量\u池条目 在该索引处,必须是一个常量的Utf8信息(§4.4.7)结构 表示字符串“Synthetic”

属性长度属性长度项的值为零。使用 Java Synthetic的•当我们 看看stack trace中的合成材料,我们就能理解它是什么。 •AOP、泛型、枚举使用Java合成Java反射API 公开检查元素是否为合成元素的方法。•普通java语言 应用程序程序员将不需要每天进行合成 编程面试时可能需要这些知识,但 不要求您在项目中使用它。当合成是 创建?当封闭类访问 嵌套类,Java编译器为此创建合成方法 属性如果源代码中有可用的getter方法,那么 不会创建合成方法。类似地,对于 内部类也被创建。有很多场合,, 这样就创建了一个合成字段、方法或类

授权:

opens包已在模块的源中隐式声明 宣言。此依赖关系是在模块声明中声明的。A. 强制构造是在 源代码,但其存在是由规范规定的。这样的 构造被称为隐式声明的。一个例子 强制元素是类中的默认构造函数,该类不包含 显式构造函数声明。另一个强制执行的例子 构造是一个隐式声明的容器注释,用于保存 可重复注释类型的多个注释。例:

 Module claim
 requires mandated java.base
第1行。定义名为claim的模块。第2行定义了 模块依赖于除java.base以外的java.base模块。这意味着出口 在源模块声明中隐式声明

参考文献:


回答这些问题的不是你吗?;-)@鬼猫哈哈……我想我会努力尝试的。只是在任何地方都找不到简单的参考。将依靠社区提供一些/更好的细节:)让我们等待Alan回答这个问题,但我猜合成输出可能是为自动模块和未命名模块创建的输出。这些模块导出包,即使它们没有声明
exports
子句。但我真的只是在猜测…@尼科莱会等待答案。就连我也想到了这里的自动模块。但接下来的问题也将是这些和强制的区别是什么?JVM定义了ACC_强制和ACC_合成标志,枚举只是在API中反映这些标志。如果编译
modulem{}
并使用
javap-v
检查生成的module-info.class,那么您将看到
需要java.base
设置了ACC_强制标志。很难找到带有ACC_合成集的模块示例,但在封装代理类时,其中一个示例位于代理区域。在这种情况下,生成的动态模块设置了ACC_合成标志。嘿!欢迎来到stackoverflow,感谢您为回答这个问题付出了这么多的努力。小请求,请您链接文档