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