gpt4 book ai didi

java - jruby + 没有公共(public)构造函数

转载 作者:太空宇宙 更新时间:2023-11-03 17:40:45 25 4
gpt4 key购买 nike

使用 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: Constructor invocation failed: tried to access method com.foo.bar.Foo.(Ljava/lang/String;)V from class org.jruby.proxy.com.foo.bar.Foo$Proxy0

编辑:

通过 IRC 上 Headius 的帮助让它工作。以下工作,但可能更智能:

 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

最佳答案

确实没有公共(public)构造函数。构造函数是包级别的。

com.foo.bar包外的其他Java类如何获取该类型的对象?可能在该包中已经有一个工厂通过调用包范围的构造函数来生成此类,并且您可以从 JRuby 调用它。

如果没有,您可以在该包中创建一个公共(public)工厂类,可能是在 Java 中,也可能是在 Ruby 中,然后从那里调用这个构造函数。

您还可以使用 monkey-patch 来添加 ruby​​ 可访问的构造函数或工厂方法,而无需修改 Java 源代码。

关于java - jruby + 没有公共(public)构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4888798/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com