繁体   English   中英

jruby +没有公共构造函数

[英]jruby + no public constructor

使用JRuby 1.6.0RC1

我有一个像

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:构造函数调用失败:尝试从类org.jruby.proxy.com.foo.bar.Foo $ Proxy0访问方法com.foo.bar.Foo。(Ljava / lang / String;)V

编辑:

通过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

确实没有为此的公共构造函数。 构造函数是程序包级别的。

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

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

您还可以通过猴子补丁添加红宝石可访问的构造函数或工厂方法,而无需修改Java源代码。

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

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

请参阅: 将Java包分配给JRuby类

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

Constructor constructor = MyClass.class.getConstructor(Class ... paramTypes);
constructor.setAccessible(true);
MyClass myClass = (MyClass)constructor.newInstance(Object ... args);

不确定您可以在JRuby中做到这一点,但我想您可以做到。

对此有一个oracle指南: http : //download.oracle.com/javase/tutorial/reflect/member/ctorInstance.html

猜猜唯一的修补程序是您提出的修补程序,或者是“从ruby类中删除您的初始化程序”(这可能是jruby中的错误-无论如何,它都不应该调用其祖先吗?)或“使Java类初始化程序受到保护”访问” [我不确定jruby为什么如此轻视软件包级别]。

http://betterlogic.com/roger/2011/05/javajavamirah-woe/comment-page-1/#comment-5034

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM