在Truffle Ruby中扩展(猴子修补)Java类

llew8vvj  于 2023-06-29  发布在  Ruby
关注(0)|答案(1)|浏览(104)

我目前正在检查将一个大项目从JRuby移植到Truffle Ruby的可能性,并且遇到了一个潜在的交易破坏者,因为Truffle文档说Java类不能重新打开。
我们使用GraalVM库中的polyglot包。
我们的项目使用了一个专有的JavaMap实现(称为GMap),它几乎在我们的Ruby代码库中的任何地方都使用。JRuby允许扩展Java类,这是非常有用的--尤其是隐藏严格的Java类型。
例如,在Java中,我们可能有:

GMap map = new GMap();
map.put("k1","test");
map.put("k2", 123);
String s = map.getStr("k1"); 
int i = map.getInt("k2");
...

而JRuby允许您向Java类添加方便的方法:

map = GMap.new
map[:key1] = 'test'
map[:key2] = 123
s = map[:key1]
i = map[:key2]
...

......这是更干净。
有人知道在Truffle Ruby中复制这种行为的方法吗?
编辑:
作为对aled评论的回复,这里有一个JRuby monkey补丁的例子,它已经被修改为使用polyglot语法:

Java.import 'org.jellyfish.gmap.GMap'

class GMap
  def [] (key)
    self.__send__(:getObj, [java.lang.String], 
      key.to_s.to_java(:string)) 
    end
  end
end

第二行代码失败,出现错误:

<Polyglot::ForeignClass[Java] type org.jellyfish.gmap.GMap>不是类

要重现错误,可以使用任何标准Java类。

hgncfbus

hgncfbus1#

GMap是否实现了java.util.Map?如果是这样,[][]=已经自动定义,如here所述。

相关问题