发布于 2021-03-26 09:38:35
从即将发布的0.12.0开始,Arrow不使用反射。以前,MonadContinuation的所有继承者在访问ContinuationUtils
类的bind
操作中都是这样做的。在这个类中,我们使用反射来读取和写入与连续堆栈标签相关的私有字段。
发布于 2021-03-27 11:55:01
正如另一个答案所述,新版本可能不会使用反射,因此有关特定库的问题就不那么重要了。然而,为了完整起见,以下是对这些问题的一些回答。
由于GraalVm在运行时本机可执行文件中的反射有问题,这会不会是Arrow的问题?
GraalVM本机映像在从程序构建可执行文件时使用静态分析。这意味着langauge的动态特性需要显式配置,以帮助分析将必要的类/方法包含到二进制文件中。例如,静态分析无法预测哪些类将通过反射访问或代理,如果这些类仅通过字符串引用,有时只能在运行时构造。
我是否可以简单地为几个类添加反射信息,或者是否需要为整个库或整个代码添加反射信息?
您确实需要通过反射API配置所有访问。库可以为它们使用反射、资源等提供配置,但是如果它们需要对应用程序类进行折射访问,那么它们就不能这样做。
所需的配置以json文件的形式出现,例如,包含类的反射配置可能如下所示:
[
{
"name" : "java.lang.String",
"fields" : [
{ "name" : "value", "allowWrite" : true },
{ "name" : "hash" }
],
"methods" : [
{ "name" : "<init>", "parameterTypes" : [] },
{ "name" : "<init>", "parameterTypes" : ["char[]"] },
{ "name" : "charAt" },
{ "name" : "format", "parameterTypes" : ["java.lang.String", "java.lang.Object[]"] }
]
}
]
上面的示例指定程序希望能够反射地使用java.lang.String
,可以访问value
和hash
字段以及列出的方法。
创建这样的配置可能有些繁琐,但是非常简单。有些框架通过提供注释来标记类,然后生成配置本身,从而为您提供帮助。
但是,如果您想要为您不知道的库创建配置,所以很难手动创建配置,那么您可以使用它,建议使用辅助配置剂。
这意味着您要执行启用javaagent的程序,该代理将跟踪并写下所有必要特性的配置:资源访问、序列化/反序列化、代理、JNI、反射等等。
因此,您可以像这样运行应用程序并执行您感兴趣的代码页(可能是通过测试),输出dir将包含配置。
java -agentlib:native-image-agent=config-output-dir=/path/to/config-dir/ -jar myjar.jar
然后,如果需要,可以手动编辑配置,例如,将其外推到未与跟踪代理一起运行的代码路径。
然后运行本机映像生成进程,传递配置选项,例如,对于反射文件配置指定:-H:ReflectionConfigurationFiles=/path/to/reflectconfig
。
您还可以使用以下事实:META-INF/native-image
目录是配置文件的默认位置,因此不必指定选项。例如,如果在config/META-INF/native-image
目录中生成配置,则可以将其放置在本机映像的类路径上,然后自动获取文件:
native-image -cp config -jar myjar.jar
https://stackoverflow.com/questions/66821320
复制