我正在尝试使用graalvm从Python代码访问Java对象。有人可以指出示例代码吗?本质上,我希望能够运行graalpython --polyglot --jvm myscript.py,其中myscript.py可以实例化Java对象
我已经阅读了graalvm文档,并且找到了一个唯一的示例,该示例从Python代码实例化了Java数组(请参见下文)。我还通过了此链接https://www.graalvm.org/docs/reference-manual/embed/#access-java-from-guest-languages中的polyglot示例,并且该示例可以运行Java polyglot API运行运行可访问java对象的python代码,但这不是我想要的。
下面的代码示例来自此link,其中还提到“并访问 Java数组以外的其他类,需要重新编译映像并提供反射配置文件”,但我不太了解我该怎么做。
import java
array = java.type("int[]")(4)
array[2] = 42
print("Printing Java Array" , array[2])
我尝试将上面的代码修改为此:
import java
import polyglot
array = java.type("int[]")(4)
array[2] = 42
print("Printing Java Array" , array[2])
# Just to see if I can access Java , example copied from Javascript -> Java
re = polyglot.eval(string="RegExp()", language="java")
我得到以下o / p:
Printing Java Array 42
Traceback (most recent call last):
File "polyglot.py", line 8, in <module 'polyglot.py'>
re = polyglot.eval(string="RegExp()", language="java")
NotImplementedError: No language for id java found. Supported languages are: [internal/nfi-native, nfi, regex, js, llvm, python, ruby]
答案 0 :(得分:3)
您不能从字符串中评估Java代码-Java语言是特殊的语言,因为它是宿主语言-您只能访问类路径上可用的内容(作为字节码)。要访问Java,您必须编写Python代码来执行此操作,而不是Java代码,例如:
NameError: name 'n' is not defined
对象的行为在某种程度上类似于Python,即实例化与调用相同,import java
regexpClass = java.type("sun.misc.Regexp")
javaRegexp = regexpClass("hello")
将为您提供可用的Java方法,等等。