我正在尝试通过JRuby 1.7 RC2使用以下代码使用java.security.KeyPairGenerator:
require 'java'
kp = java.security.KeyPairGenerator.getInstance("RSA")
puts kp #java.security.KeyPairGenerator$Delegate@45f177b
但是,当我尝试调用初始化时,即
kp.initialize(2048)
我得到以下异常:-
TypeError: no public constructors for #<Class:0x7efe8e7a>
任何建议将不胜感激。
这是 ruby 的initialize
方法(它是 ruby 世界中的构造函数)和这个特定 java 类中的方法之间的一个小冲突。
通常,人们不会在 ruby 类上调用initialize
(你调用new
),但无论如何,它似乎给解释器带来了一些混乱。
如果你看一下kp.methods
的输出,你会发现JRuby增加了一个initialize__method
来规避冲突(注意双下划线)。
试试这个:
require 'java'
kp = java.security.KeyPairGenerator.getInstance("RSA")
kp.initialize__method(2048)
另一种技术是使用java_method,当解释器在选择正确的重载时遇到问题时,这也很有用。
例如:
m = kp.java_method :initialize, [Java::int]
m.call(2048)