什么';在Java9中,合成修饰语和强制修饰语的区别是什么
java文档中的 导出是在模块的源中隐式声明的 声明 导出未在源中显式或隐式声明 模块声明 查看一些什么';在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
模块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,感谢您为回答这个问题付出了这么多的努力。小请求,请您链接文档