java - GraalVM:允许外部脚本访问本机编译对象
问题描述
我正在创建一个 java/groovy 应用程序,它还支持通过 groovy 编写脚本。有很多遗留的 Java 代码和用 Groovy 编写的新部分。除此之外,该应用程序还可以使用 groovy 编写脚本。
我可以让所有东西都在 VM 下运行,并像过去一样混淆 jar 中的符号 - 没问题。但:
我正在评估使用 GraalVM 创建本机二进制文件,但问题是它如何与在运行时运行外部 groovy 脚本兼容?graal 是否保留类和方法的符号信息,以及方法调用的数据交换如何从脚本处理到本机?我不确定这是否会奏效。
从过去的类似项目中,我知道在大多数情况下,本机编译会去除任何符号的二进制文件。我还需要这个功能来代替混淆。计划是为某些方法和对象保留符号,这些符号只允许由外部 groovy 脚本访问。
澄清:这尤其与 GroovyScriptEngine 和 CroovyClassLoader 有关。此处为第 1.3 和 1.4 节。
与 groovy VM 相比,GraalVM 的内存模型如何编译 groovy?如果我在运行时加载一个类并将一个从本机端创建的对象 foo 传递给它,那么脚本是否可以正常工作并能够正常使用成员,甚至可以对 foo 进行反射?
谢谢您的帮助。
解决方案
@Boris 是正确的,groovy 在所有脚本运行时编译中内部使用 java 类加载器。没有 JVM,Graal 的 native/Substrate VM 版本无法运行新生成的 JVM butecode。
推荐阅读
- bash - 无法通过 Jenkinsfile 在 Bash 脚本中执行 AWS CLI
- mysql - Mysql LEFT JOIN 在两个参数上,在非常大的表上具有一个精确匹配和一个 LIKE 匹配 - 性能
- unity3d - Unity 2018.3.X 自动完成问题
- android - 如何使用 RxJava2 和 Room Persistence Library 实现内存缓存?
- php - Laravel 说调用未定义的函数 bzcompress
- c++ - lua_gettop 返回 0 但堆栈的行为不像是空的
- javascript - 如何使用 json_encode 将数据正确打印到网页?
- html - 如何覆盖 Bootstrap 3 导航栏边距类
- r - 在 Ubuntu 18.04LTS 上在 R 中安装 OpenMx 包
- android-renderscript - Renderscript 编译错误 - 它们在哪里?