【发布时间】:2011-06-01 10:28:17
【问题描述】:
使用 JRuby 1.6.0RC1
我有一个类似的 java 文件
package com.foo.bar
public class Foo
{
Foo(String baz){}
}
如果,在 jruby 中,我会这样做
com.foo.bar.Foo.new "foo"
然后我得到
TypeError: no public constructors for Java::ComFooBar::Foo
阅读http://jira.codehaus.org/browse/JRUBY-5009 让我觉得这是 WAD,但是如何在不更改 java 文件的情况下解决这个问题?
子类化 Foo 然后实例化我得到一个不同的错误:
ArgumentError:构造函数 调用失败:试图访问 方法 com.foo.bar.Foo.(Ljava/lang/String;)V 从班级 org.jruby.proxy.com.foo.bar.Foo$Proxy0
编辑:
在 Headius 对 IRC 的帮助下,它得以工作。以下工作,但可能更智能:
def package_local_constructor klass,*values
constructors = klass.java_class.declared_constructors
constructors.each do |c|
c.accessible = true
begin
return c.new_instance(*values).to_java
rescue TypeError
false
end
end
raise TypeError,"found no matching constructor for " + klass.to_s + "(" + value.class + ")"
end
【问题讨论】: