java classes with non-public constructors are incorrectly instantiated
----------------------------------------------------------------------

                 Key: JRUBY-3011
                 URL: http://jira.codehaus.org/browse/JRUBY-3011
             Project: JRuby
          Issue Type: Bug
          Components: Java Integration
    Affects Versions: JRuby 1.1.4
         Environment: JDK5 on MacOS X
            Reporter: Igor Minar


I have a class:

{code}
package com.some.pkg;

public class Foo {
  boolean bar;

  Foo() {
      bar = true;
  }
}
{code}

{noformat}
$ jirb
irb(main):001:0> require 'dist/some-pkg.jar'
=> true
irb(main):002:0> x = com.some.pkg.Foo.new
=> #<Java::ComSomePkg::Foo:0x1be20c @[EMAIL PROTECTED]>
irb(main):003:0> x.class
=> Java::ComSomePkg::Foo
irb(main):004:0> x.inspect
=> "#<Java::ComSomePkg::Foo:0x1be20c @[EMAIL PROTECTED]>"
{noformat}

As you can see above, the internal @java_object is of a type Object, instead of 
com.some.pkg.Foo. This means that even though JRuby returned some object when I 
called Foo.new, this object is not a valid instance of com.some.pkg.Foo class.

This also results in odd errors when I call methods of the corrupted instance:
{noformat}
irb(main):006:0> x.bar    
TypeError: invokee not instance of method's class (gotjava.lang.Object wanted 
com.some.pkg.Foo)
        from (irb):7:in `binding'
        from /usr/local/jruby/jruby-1.1.4/lib/ruby/1.8/irb.rb:150:in 
`eval_input'
        from /usr/local/jruby/jruby-1.1.4/lib/ruby/1.8/irb.rb:259:in 
`signal_status'
        from /usr/local/jruby/jruby-1.1.4/lib/ruby/1.8/irb.rb:147:in 
`eval_input'
        from /usr/local/jruby/jruby-1.1.4/lib/ruby/1.8/irb.rb:146:in 
`eval_input'
        from /usr/local/jruby/jruby-1.1.4/lib/ruby/1.8/irb.rb:70:in `start'
        from /usr/local/jruby/jruby-1.1.4/lib/ruby/1.8/irb.rb:69:in `catch'
        from /usr/local/jruby/jruby-1.1.4/lib/ruby/1.8/irb.rb:69:in `start'
        from /usr/local/jruby/current/bin/jirb:19
irb(main):007:0> x.getBar
TypeError: invokee not instance of method's class (gotjava.lang.Object wanted 
com.some.pkg.Foo)
        from (irb):8:in `binding'
        from /usr/local/jruby/jruby-1.1.4/lib/ruby/1.8/irb.rb:150:in 
`eval_input'
        from /usr/local/jruby/jruby-1.1.4/lib/ruby/1.8/irb.rb:259:in 
`signal_status'
        from /usr/local/jruby/jruby-1.1.4/lib/ruby/1.8/irb.rb:147:in 
`eval_input'
        from /usr/local/jruby/jruby-1.1.4/lib/ruby/1.8/irb.rb:146:in 
`eval_input'
        from /usr/local/jruby/jruby-1.1.4/lib/ruby/1.8/irb.rb:70:in `start'
        from /usr/local/jruby/jruby-1.1.4/lib/ruby/1.8/irb.rb:69:in `catch'
        from /usr/local/jruby/jruby-1.1.4/lib/ruby/1.8/irb.rb:69:in `start'
        from /usr/local/jruby/current/bin/jirb:19
irb(main):005:0> x.get_bar
TypeError: invokee not instance of method's class (gotjava.lang.Object wanted 
com.some.pkg.Foo)
        from (irb):6:in `binding'
        from /usr/local/jruby/jruby-1.1.4/lib/ruby/1.8/irb.rb:150:in 
`eval_input'
        from /usr/local/jruby/jruby-1.1.4/lib/ruby/1.8/irb.rb:259:in 
`signal_status'
        from /usr/local/jruby/jruby-1.1.4/lib/ruby/1.8/irb.rb:147:in 
`eval_input'
        from /usr/local/jruby/jruby-1.1.4/lib/ruby/1.8/irb.rb:146:in 
`eval_input'
        from /usr/local/jruby/jruby-1.1.4/lib/ruby/1.8/irb.rb:70:in `start'
        from /usr/local/jruby/jruby-1.1.4/lib/ruby/1.8/irb.rb:69:in `catch'
        from /usr/local/jruby/jruby-1.1.4/lib/ruby/1.8/irb.rb:69:in `start'
        from /usr/local/jruby/current/bin/jirb:19
{noformat}

Another problem that might or might not be related is that when a class with a 
non-public constructor with parameters is created which suppresses the implicit 
parameterless constructor, JRuby tries to instantiate this class using the 
parameterless constructor:

{code}
package com.some.pkg;

public class Foo {
  boolean bar;

  Foo(boolean requiredParam) {
    bar = requiredParam;
  }

  public boolean getBar() {
      return bar;
  }
}
{code}

{noformat}
$ jirb
require 'irb(main):001:0> require 'dist/some-pkg.jar'
=> true
irb(main):002:0> x = com.some.pkg.Foo.new(true)
ArgumentError: wrong # of arguments(1 for 0)
        from (irb):4:in `binding'
        from /usr/local/jruby/jruby-1.1.4/lib/ruby/1.8/irb.rb:150:in 
`eval_input'
        from /usr/local/jruby/jruby-1.1.4/lib/ruby/1.8/irb.rb:259:in 
`signal_status'
        from /usr/local/jruby/jruby-1.1.4/lib/ruby/1.8/irb.rb:147:in 
`eval_input'
        from /usr/local/jruby/jruby-1.1.4/lib/ruby/1.8/irb.rb:146:in 
`eval_input'
        from /usr/local/jruby/jruby-1.1.4/lib/ruby/1.8/irb.rb:70:in `start'
        from /usr/local/jruby/jruby-1.1.4/lib/ruby/1.8/irb.rb:69:in `catch'
        from /usr/local/jruby/jruby-1.1.4/lib/ruby/1.8/irb.rb:69:in `start'
        from /usr/local/jruby/current/bin/jirb:19
irb(main):003:0> x = com.some.pkg.Foo.new
=> #<Java::ComSomePkg::Foo:0x1be20c @[EMAIL PROTECTED]>
{noformat}

I'm not entirely sure if JRuby can instantiate classes via non-public 
constructors, if that was not possible, an exception should be raised instead 
of returning corrupted objects.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply via email to