Java jruby+;没有公共构造函数

Java jruby+;没有公共构造函数,java,ruby,jruby,Java,Ruby,Jruby,使用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 阅读让我觉得这是WAD,但是我如何在不改变java文件的情况下解决这个问题呢 子类化Foo,然后实例化

使用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
阅读让我觉得这是WAD,但是我如何在不改变java文件的情况下解决这个问题呢

子类化Foo,然后实例化,我得到一个不同的错误:

ArgumentError:构造函数 调用失败:尝试访问 方法 foo.bar.foo.(Ljava/lang/String;)V 来自课堂 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

在Java中,您可以使用反射API执行以下操作:

Constructor constructor = MyClass.class.getConstructor(Class ... paramTypes);
constructor.setAccessible(true);
MyClass myClass = (MyClass)constructor.newInstance(Object ... args);
我不确定你能在JRuby中做到这一点,但我想你能做到


oracle对此有一个指南:

在Java中,您可以使用反射API执行以下操作:

Constructor constructor = MyClass.class.getConstructor(Class ... paramTypes);
constructor.setAccessible(true);
MyClass myClass = (MyClass)constructor.newInstance(Object ... args);
我不确定你能在JRuby中做到这一点,但我想你能做到


oracle对此有一个指南:

这是因为构造函数具有包级访问权限

您可以尝试在与foo类相同的包中定义ruby类


请参阅:

这是因为构造函数具有包级访问权限

您可以尝试在与foo类相同的包中定义ruby类


请参阅:

确实没有用于此的公共构造函数。构造函数是包级别的

com.foo.bar
之外的其他Java类如何获取这种类型的对象?可能该包中已经有一个工厂通过调用包作用域构造函数生成此类,您可以从JRuby调用该工厂

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


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

确实没有用于此的公共构造函数。构造函数是包级别的

com.foo.bar
之外的其他Java类如何获取这种类型的对象?可能该包中已经有一个工厂通过调用包作用域构造函数生成此类,您可以从JRuby调用该工厂

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


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

猜测唯一的修复方法是您建议的,或者“从ruby类中删除您的初始值设定项”(这可能是jruby中的一个bug——它不应该调用它的祖先吗?)或者“使java类初始值设定项受保护的访问”[我不知道为什么jruby如此轻视包级别]


我猜唯一的修复方案是您提出的,或者“从ruby类中删除您的初始值设定项”(这可能是jruby中的一个bug——它无论如何都不应该调用它的祖先吗?)或者“让java类初始值设定项受保护的访问”[我不确定为什么jruby如此轻视包级别]


我认为这应该是正确的方法,但它似乎不起作用。作为参考,我在groovy中也尝试过同样的方法,要实例化该类,我唯一要做的就是导入包。不过,这在这里没有什么区别。我相信这应该是正确的方法,但似乎不起作用。a这是一个参考点,我在groovy中也做过同样的尝试,我唯一需要做的就是导入包。不过这没有什么区别。这远不是一个完整的解决方案,但它是我得到的最接近的解决方案,所以我接受它。这远不是一个完整的解决方案,但它是clo我得到的最好的,所以我会接受的。