在另一个 Stackoverflow 问题的评论中提到,可以从 Smalltalk 访问 Java 包。
但是,我在网上搜索时找不到任何有关此的信息。
在这方面的任何见解都将受到高度赞赏。
本质上,在 Smalltalk/X 中(重新)使用 Java 代码有三种方法:
按照 Victor 的建议,使用 JNI 实现/端口绑定到 Java。虽然没有移植到 Smalltalk/X,但这是由 Johan Brichau 等人完成的。- 搜索“JavaConnect”,
然后有一个“Java 桥”连接到远程 JVM 并在那里执行代码,由 eXept 在他们的产品中开发和使用。AFAIK,这是一个专有包 - 您可以购买(或不购买)许可证。有关详细信息,您可能需要询问 eXept。
最后,还有 stx:libjava,它是一个 Smalltalk/X API,用于将 Java 类直接加载到正在运行的 Smalltalk/X 运行时中。
像往常一样,这些选项中的每一个都有自己的优点和缺点。我将专注于最后一个 - stx:libjava - 这是@tukan 想到的。
免责声明:我(重新)设计和(重新)实现了 stx:libjava 的大部分内容,所以在我有偏见的情况下,请谨慎对待我的观点。
stx:libjava 是一个允许将 Java 代码加载到 Smalltalk/X 环境中并执行它的包。加载后,Java 代码和 Java 对象以及 Smalltalk 代码和 Smalltalk 对象之间没有区别——它们都存在于同一个运行时(如果您愿意,可以使用虚拟机)。事实上,大多数运行时不知道(也不关心)给定的对象或方法实际上是 Smalltalk 还是 Java 的。运行时内部只有两个组件可以区分——即字节码解释器(因为 Smalltalk/X 字节码与 Java 字节码非常不同)和 JIT 编译器前端(出于同样的原因)。因此,执行 Smalltalk 或 Java 代码在性能方面没有区别。
下面是使用 Smalltalk/X 的 Java 实现的 SAXON XSLT 处理器的示例:
[
config := JAVA net sf saxon Configuration new.
config setAllNodesUntyped: true.
factory := JAVA net sf saxon TransformerFactoryImpl new: config.
stylesheet := factory newTemplates:
(JAVA javax xml transform stream StreamSource new:
(JAVA java io File new: 'cd.xsl')).
input :=
(JAVA javax xml transform stream StreamSource new:
(JAVA java io File new: 'cd.xml')).
output :=
(JAVA javax xml transform stream StreamResult new:
(JAVA java io File new: 'cd.html')).
transformer := stylesheet newTransformer.
transformer transform: input to: output.
] on: JAVA java io IOException do:[:ex|
Transcript showCR:'I/O error: ', ex getMessage.
ex printStackTrace.
] on: JAVA javax xml transform TransformerException do:[:ex|
Transcript showCR:'Transform error: ', ex getMessage.
ex printStackTrace.
].
以下资源可能会让您更好地了解它的含义:
关于 Smalltalk 与 Java 的整合 https://www.sciencedirect.com/science/article/pii/S0167642313002839?via%3Dihub
在 Java 中实现运行时代码更新 - 使用 STX:LIBJAVA 的探索 https://pdfs.semanticscholar.org/d7da/968e4ab36d6deca51bd45b9bbb70e73a2afd.pdf?_ga=2.80940304.648336672.1556837288-1980277485.15568378
快速浏览,展示如何开发一个简单的“Hello World!” 使用 Smalltalk/X 和 Java 的应用程序 http://swing.fit.cvut.cz/projects/stx/doc/online/english/programming/java-helloworld.html
STX:LIBJAVA 中的动态代码更新 https://www.youtube.com/watch?v=p3J554BNEz8
玩 Java https://youtu.be/p21z3bAt7b0