一种基于配置化反射与方法缓存的仿真引擎数据交互方法及系统与流程

摘要: 本技术涉及电磁环境效应仿真与计算机数据处理,特别是涉及一种面向强电磁环境构建的、基于配置化反射与方法缓存的仿真引擎数据交互方法及系统,尤其适用于复杂电磁环境下雷...
一种基于配置化反射与方法缓存的仿真引擎数据交互方法及系统与流程

本技术涉及电磁环境效应仿真与计算机数据处理,特别是涉及一种面向强电磁环境构建的、基于配置化反射与方法缓存的仿真引擎数据交互方法及系统,尤其适用于复杂电磁环境下雷达辐射场预测、电子设备电磁兼容性分析以及电磁脉冲效应推演等仿真应用场景。

背景技术:

1、在强电磁环境构建仿真中,开发人员通常在编写雷达辐射源模型或高功率微波源模型的源代码时,直接通过对象引用显式调用线缆耦合模型或天线接收模型的特定方法。当仿真时间步进推进时,求解器按编译时确定的顺序依次计算空间场分布与耦合响应。

2、部分改进的电磁仿真软件采用xml或json文件描述模型之间的关联关系。仿真引擎在启动初始化阶段,通过解析该配置文件一次性生成固定的java对象引用关系图,并在随后的整个仿真运行期间保持该关系图不变,数据交互路径在运行期不可更改。

3、随着仿真应用场景复杂度的提升,特别是在需要对模型算法进行高频次迭代验证或需要动态调整仿真拓扑结构的场景下,上述现有技术方案暴露出以下技术层面的缺陷:1)接口耦合严重:模型源代码内部显式依赖交互模型的具体类定义和方法,需求变更必须修改源码、重新编译、重启jvm,产生大量非计算等待时间,降低有效资源利用率;2)内存占用冗余:硬编码或静态依赖注入会全量预加载类路径下所有模型类,造成不必要内存占用,限制单节点最大仿真模型并发容量;3)反射性能损耗:常规反射在每个节拍重复查找方法,时间复杂度高,无法满足实时仿真节拍推进要求。

技术实现思路

1、鉴于此,本技术提供一种基于配置化反射与方法缓存的仿真引擎数据交互方法及系统, 应用于强电磁环境构建与电磁耦合效应分析仿真系统中的、基于java反射机制与结构化配置文件实现多物理场仿真模型间数据交互动态映射与调度的控制,尤其适用于复杂电磁环境下雷达辐射场预测、电子设备电磁兼容性(emc)分析、以及电磁脉冲效应推演等具体仿真应用场景。

2、本技术公开了一种基于配置化反射与方法缓存的仿真引擎数据交互方法,其包括:

3、步骤1:仿真引擎解析结构化配置文件,得到交互映射关系列表、模型定义列表、时间步长;其中,交互映射关系列表的每条记录包括源模型实例标识符、目标模型实例标识符、数据字段名、目标模型写入方法名;模型定义列表的每条记录包括模型实例标识符、模型类全限定名;

4、步骤2:仿真引擎读取模型定义列表,提取交互映射关系列表内出现的全部源模型实例标识符与目标模型实例标识符,经去重后形成本次仿真使用的模型实例标识符集合,针对该集合中的每一个模型实例标识符,从模型定义列表中匹配对应的模型类全限定名,利用java反射机制动态加载该类并创建模型实例对象,基于全部经反射创建得到的模型实例对象,生成以模型实例标识符为键、模型实例对象引用为值的实例映射表;

5、步骤3:仿真初始化阶段,仿真引擎读取交互映射关系列表,逐条解析每条记录,对于当前记录,先从实例映射表中获取目标模型实例标识符对应的目标模型实例对象,再解析数据字段名对应的参数类型;根据目标模型写入方法名与参数类型,通过反射机制获取目标模型实例对象对应的写入方法method对象,调用该method对象的可访问性设置方法关闭访问权限检查后,以源模型实例标识符:目标模型实例标识符:数据字段名为键,将该method对象存入哈希映射表;遍历完成后,将构建完成的哈希映射表交付核心调度引擎模块;

6、步骤4:核心调度引擎模块读取仿真时间步长推进仿真时钟;在每个仿真时间节拍内,遍历交互映射关系列表,对于当前记录,从实例映射表中获取源模型实例对象和目标模型实例对象;根据数据字段名按命名规范动态拼接源模型的数据读取方法名,即getter方法名,通过反射调用获取源模型的输出数据值;以源模型实例标识符:目标模型实例标识符:数据字段名为键从哈希映射表中检索对应的method对象;通过该method对象的invoke方法将输出数据反射注入目标模型实例,完成模型间数据交互。

7、进一步地,所述通过反射动态创建模型实例对象,包括:

8、采用class.forname()加载模型类全限定名对应的类,仅对交互映射关系列表引用的模型执行类加载操作;通过调用所加载类的构造方法生成模型实例对象;未在结构化配置文件中引用的模型类不执行类加载与实例创建操作。

9、进一步地,解析交互映射关系列表的每条记录内数据字段名对应的参数类型包括三种实现方式中的任意一种:

10、实现方式一:预先在模型类中定义数据字段与类型映射关系,运行时根据数据字段名查表获取对应的参数类型;

11、实现方式二:在结构化配置文件中增设parametertype字段,显式标注每条交互关系对应的参数类型;

12、实现方式三:遍历目标模型类的全部写入方法,根据目标模型写入方法名匹配对应方法,提取该方法的参数类型。

13、进一步地,目标模型写入方法对应的方法名字符串外置存储于结构化配置文件;仿真初始化阶段,从实例映射表中获取目标模型实例对象,根据目标模型写入方法名与解析得到的参数类型,通过反射机制预获取对应的method对象;以源模型实例标识符:目标模型实例标识符:数据字段名为键,将method对象存入哈希映射表;反射获取目标模型写入方法对应的对象后,调用对象的setaccessible(true)方法关闭java虚拟机访问权限检查。

14、进一步地,所述在每个仿真时间节拍内完成源模型输出数据读取、模型实例调取、反射注入交互操作,包括:

15、从实例映射表中获取源模型实例标识符对应的源模型实例对象,以及目标模型实例标识符对应的目标模型实例对象;

16、从交互映射关系列表中提取数据字段名,将数据字段名首字母大写后拼接get前缀,生成源模型对应的getter方法名,通过反射调用该getter方法获取源模型的输出数据值;

17、以源模型实例标识符:目标模型实例标识符:数据字段名组成的检索键,从哈希映射表中匹配对应的method对象;

18、调用该method对象的invoke方法,将输出数据值反射注入目标模型实例的目标模型写入方法。

19、进一步地,当交互映射关系列表中单条记录的源模型实例标识符与目标模型实例标识符相同时,执行以下操作:

20、从实例映射表中获取该模型实例对象;

21、根据数据字段名拼接生成getter方法名,通过反射调用获取该模型实例对象的输出数据值;

22、从哈希映射表中检索对应的method对象;

23、通过invoke方法将输出数据值反射注入该实例对象对应的目标模型写入方法,更新模型实例对象的运行参数。

24、进一步地,所述哈希映射表中存储的对象为method对象,或者,所述哈希映射表中存储的对象为方法句柄,所述方法句柄为java.lang.invoke.methodhandle类型。

25、进一步地,所述结构化配置文件包括simulationname字段、tickinterval字段、interactions字段和modeldefinitions字段;其中,simulationname字段用于存储仿真任务名称;simulationname字段用于存储仿真任务名称;tickinterval字段用于存储仿真时钟步长;interactions字段为交互条目列表,用于存储交互映射关系列表,其中每条交互条目包括源模型实例标识符、目标模型实例标识符、数据字段名、目标模型写入方法名;modeldefinitions字段为模型定义条目列表,用于存储模型实例标识符与模型类全限定名的对应关系;

26、所述结构化配置文件还能够增设parametertype字段,用于显式标注数据字段对应的参数类型。

27、进一步地,所述结构化配置文件的格式包括json格式、yaml格式,以及采用接口定义语言定义的二进制序列化格式。

28、本技术还公开了一种基于配置化反射与方法缓存的仿真引擎数据交互系统,实现上述所述的基于配置化反射与方法缓存的仿真引擎数据交互方法,其包括配置文件解析模块、反射式模型工厂模块、方法句柄缓存池模块与核心调度引擎模块;

29、配置文件解析模块,用于解析结构化配置文件,得到交互映射关系列表、模型定义列表、仿真时间步长;交互映射关系列表的每条记录包括源模型实例标识符、目标模型实例标识符、数据字段名、目标模型写入方法名;模型定义列表的每条记录包括模型实例标识符、模型类全限定名;

30、反射式模型工厂模块,用于读取模型定义列表,提取交互映射关系列表内的源模型实例标识符与目标模型实例标识符,经去重后匹配得到对应的模型类全限定名,通过反射动态创建模型实例对象;基于全部经反射创建得到的模型实例对象,生成以模型实例标识符为键、模型实例对象引用为值的实例映射表;

31、方法句柄缓存池模块,用于在仿真初始化阶段读取交互映射关系列表,逐条解析每条记录;对于当前记录,从实例映射表中获取目标模型实例对象,解析数据字段名对应的参数类型,根据目标模型写入方法名与参数类型反射获取对应的method对象;调用所述method对象的setaccessible方法关闭访问权限检查后,以源模型实例标识符:目标模型实例标识符:数据字段名为键,将method对象存入哈希映射表,遍历完成后,将哈希映射表交付核心调度引擎模块;

32、核心调度引擎模块,用于读取时间步长推进仿真时钟;在每个仿真时间节拍内,遍历交互映射关系列表;对于当前记录,从实例映射表中获取源模型实例对象和目标模型实例对象;根据数据字段名按命名规范动态拼接生成源模型的getter方法名,通过反射调用获取源模型的输出数据值;以源模型实例标识符:目标模型实例标识符:数据字段名为检索键,从哈希映射表中匹配对应的method对象;通过method对象的invoke方法将输出数据值反射注入目标模型写入方法,完成模型间数据交互。

33、与现有技术相比,本技术具有以下有益的技术效果:

34、1、显著降低仿真编译与部署时延:通过将模型接口依赖关系从编译期转移至运行期,模型源代码之间实现完全解耦。当仿真交互拓扑发生变更时,仅需修改文本配置文件,无需调用java编译器执行重编译及字节码验证流程,消除了因模型修改引发的编译等待时间,提升了仿真系统的迭代验证效率。

35、2、大幅优化内存空间占用:采用惰性按需加载策略,杜绝了无效模型类的预加载行为。对于包含大量潜在模型定义的超大规模仿真系统,本方案可使jvm堆内存的初始占用基线大幅降低,从而提升单计算节点所能承载的并发仿真模型实例数量,提高了硬件资源利用率。此外,结构化配置文件将交互关系列表(interactions字段)与模型定义列表(modeldefinitions字段)分离存储,使得仿真引擎能够先解析交互关系确定本次仿真实际使用的模型实例标识符集合,再根据该集合从模型定义列表中按需加载对应的模型类,为惰性按需实例化策略提供了数据结构层面的支撑,进一步降低了jvm堆内存的非必要占用。

36、3、保障仿真运行的实时性能:通过对method对象(或作为替代实施方式的方法句柄methodhandle)的预缓存,将运行时反复进行的方法查找操作由原本的时间开销较大的遍历查找优化为哈希映射表的o(1)常数时间复杂度检索。同时,通过调用setaccessible(true)关闭java访问权限检查,使得反射调用的性能接近原生直接调用水平,保障了仿真节拍推进的实时性要求。