将内联方法的字节码保留在生成的 JAR 中

问题描述 投票:0回答:1

无论如何,我都不是 Scala 开发人员,但我需要在我的 Java 项目中使用一些用 Scala 编写的库。 我可以从该库构建 JAR 并将其用作 Maven 依赖项,从中导入类(尽管名称有些混乱),但有一件事阻止我完全使用该库。 那里的大多数类都富含带有“内联”修饰符的方法。这些方法对我来说看起来很有用,我希望能够自由地调用它们。 但由于它们的内联性质,它们在构建期间被优化,远离生成的 .class 文件,仅写入 .tasty 文件,这些文件被 Java 编译器忽略,因此 Java 代码无法访问它们。 因此,我需要的是在 Java 可访问的字节码中获取这些方法,方法是在编译器级别完全禁用内联,或者保持它们内联,但另外将它们的主体编译到 .class 文件中。 我尝试使用一些相关的 scalac CLI 选项,例如 -opt:* 和 -Yno-inline,但运气不佳,Scala 3 不再提供任何选项。 然后我询问 ChatGPT,它建议编写 Scala 编译器插件,该插件以编程方式更改 AST 树中的一些相关标志,但由于缺少导入,提供的代码未编译,我无法在 scala3-compiler 中找到它们。我尝试用 google 搜索一些有关编写 Scala 编译器插件的理论,但也没有成功。 所以我的问题非常简单 - 如何强制将内联方法包含到字节码中?谢谢。

java scala inline jvm-bytecode
1个回答
0
投票

您暗示您对 Scala 有一定了解,因此一种选择是为该库编写您自己的 Scala 包装器:

  1. 为您要从 Java 代码中使用的函数定义 Java 接口

  2. 使用 Scala 库在 Scala 中实现 Java 接口

  3. 将此新库导入到您的 Java 代码中并使用 Java 接口

第 1 阶段避免了名称混乱的问题,因为您将在第 3 阶段使用纯 Java 接口。

第 2 阶段将可以访问 Scala 代码中的

inline
函数,并且可以从 Java 中使用它们。

© www.soinside.com 2019 - 2024. All rights reserved.