【问题标题】:JRuby - TypeError: no public constructors for #<Class:>JRuby - TypeError:#<Class:> 没有公共构造函数
【发布时间】:2012-10-18 09:02:26
【问题描述】:

我正在尝试按照以下代码通过 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>

非常感谢任何建议。

【问题讨论】:

    标签: jruby


    【解决方案1】:

    这是 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)
    

    【讨论】:

    • 非常感谢这个问题的一个很好的描述/答案!
    猜你喜欢
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 2023-01-17
    • 2011-02-08
    • 2017-04-30
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    相关资源
    最近更新 更多