Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 爪哇9:;打开';不需要通过反射进行访问的模块?_Java_Reflection_Module - Fatal编程技术网

Java 爪哇9:;打开';不需要通过反射进行访问的模块?

Java 爪哇9:;打开';不需要通过反射进行访问的模块?,java,reflection,module,Java,Reflection,Module,打开Java模块逻辑中的关键字,允许反射访问()。我最近移植了一个复杂的JavaFX应用程序。Java15获得了成功,但这是一场噩梦,因为JavaFX正确地基于反射访问 我的问题是关于一个更简单的Java 15应用程序的,它可以完美地工作,但是我预期会出现一个运行时错误,而不会发生!为什么?欢迎光临。。。因此,我在两个模块之间有一个非常常见的客户机/服务器关系,如下所示: 模块PauWare2{ 导出com.pauware.pauware_engine.Core; } 模块我的设备模块{ 需要P

打开Java模块逻辑中的
关键字,允许反射访问()。我最近移植了一个复杂的JavaFX应用程序。Java15获得了成功,但这是一场噩梦,因为JavaFX正确地基于反射访问

我的问题是关于一个更简单的Java 15应用程序的,它可以完美地工作,但是我预期会出现一个运行时错误,而不会发生!为什么?欢迎光临。。。因此,我在两个模块之间有一个非常常见的客户机/服务器关系,如下所示:

模块PauWare2{
导出com.pauware.pauware_engine.Core;
}
模块我的设备模块{
需要PauWare2;
}
您可能会注意到,
打开
未在
我的设备模块
中使用。实际上,
PauWare2
通过反射访问公共方法:

包我的设备包;
“我的设备”模块中的公共类我的设备{//
public void a(){}
com.pauware.pauware\u engine.Core.AbstractStateMachine\u My\u device\u state\u machine;
//“我的设备状态机器”对“a”方法的反射访问:
_My_device_state_machine.launchByReflection(此“a”);
}

我预期会出现运行时错误,这涉及到
将我的\u设备\u包打开到PauWare2
我的设备\u模块中
?然而,正如所说的,一点问题都没有。。。你知道吗?提前感谢。

与Java语言规范相比:

exports
指令指定当前模块要导出的包的名称。对于其他模块中的代码,这将在编译时和运行时授予对包中的
public
protected
类型以及这些类型的
public
protected
成员()的访问权。它还为其他模块中的代码授予对这些类型和成员的反射访问权

opens
指令指定当前模块要打开的包的名称。对于其他模块中的代码,这将在运行时而不是编译时授予对包中的
public
protected
类型以及这些类型的
public
protected
成员的访问权限。它还授予包中所有类型及其所有成员对其他模块中代码的反射访问权

因此,
opens
指令的要点不是授予反射访问权,
exports
也这样做。使用
打开
而不是
导出
的目的不是授予编译时访问权限,这意味着在运行时只能进行反射访问

因此,无论如何导出包时,都不需要额外的
打开
。这意味着,如果您可以直接访问某个对象,那么您也可以通过反射方式访问它

或者,按照规范的字面意思,不是通过编译标准Java源代码生成的类文件可以在运行时访问打开的类型和成员


你链接的这篇文章是关于“深度反思”的,通过打电话联系会员。但即使是引用的文件也说:

如果以下任一情况保持不变,则类
C
中的调用者可以使用此方法来启用对
D
的访问:

  • C
    D
    在同一模块中
  • 该成员是
    public
    D
    public
    ,位于包含
    D
    的模块到至少包含
    C
    的模块的包中
  • 成员是受保护的静态
D
是包含
D
的模块导出到至少包含
C
的模块的包中的公共
C
D
的子类
  • D
    在一个包中,包含
    D
    的模块至少与包含
    C
    的模块连接。未命名模块和打开模块中的所有包都对所有模块开放,因此当
    D
    位于未命名模块或打开模块中时,此方法始终成功
  • 因此,第二个项目符号清楚地表明,您也可以对导出包的
    public
    类型的
    setAccessible(true)
    成员使用
    setAccessible(true)

    下一节将介绍相关差异:

    当声明类位于调用方的不同模块中,且包含声明类的包未对调用方的模块打开时,此方法不能用于启用对私有成员、具有默认(包)访问权限的成员、受保护的实例成员或受保护的构造函数的访问


    因此,这只会对非
    公共
    成员产生影响,尤其是
    私有
    和默认(包)访问。只有“深度反射”——访问通常无法访问的内容——是被禁止的
    a()
    是公开的。在多次阅读您的问题后,我意识到不清楚什么是以何种方式访问什么。类
    My\u device
    的一个变量正在访问类
    My\u device
    中的类
    My\u device
    的一个方法,但在另一个模块中?提供一个示例,演示您认为不可能进行的实际访问。我验证了未导出或打开的包无法被其他模块访问。你没有展示反射访问是如何完成的。您添加了一个方法调用
    launchByReflection
    ,该方法的代码不包括在其中,在实际源代码中甚至不可能进行方法调用。如前所述,请提供一个,而不是一些伪代码片段。您可以与进行比较,以了解您在检查访问未报告包的行为时的不同之处。一个常见的错误是使用类路径,换句话说,根本不使用模块