diff -ur jruby-1.4.0/src/org/jruby/java/proxies/ConcreteJavaProxy.java jruby-1.4.0-typed_null/src/org/jruby/java/proxies/ConcreteJavaProxy.java --- jruby-1.4.0/src/org/jruby/java/proxies/ConcreteJavaProxy.java 2009-11-02 10:15:10.000000000 -0800 +++ jruby-1.4.0-typed_null/src/org/jruby/java/proxies/ConcreteJavaProxy.java 2010-01-06 15:01:52.000000000 -0800 @@ -4,6 +4,7 @@ import org.jruby.RubyClass; import org.jruby.RubyModule; import org.jruby.internal.runtime.methods.DynamicMethod; +import org.jruby.internal.runtime.methods.JavaMethod.JavaMethodZero; import org.jruby.javasupport.JavaObject; import org.jruby.javasupport.util.RuntimeHelpers; import org.jruby.runtime.Block; @@ -28,11 +29,19 @@ } }); - RubyClass singleton = concreteJavaProxy.getSingletonClass(); + final RubyClass singleton = concreteJavaProxy.getSingletonClass(); final DynamicMethod oldNew = singleton.searchMethod("new"); singleton.addMethod("new", new ConcreteNewMethod(singleton, Visibility.PUBLIC, oldNew)); + singleton.addMethod("null", new JavaMethodZero(singleton, Visibility.PUBLIC) { + @Override + public IRubyObject call(ThreadContext context, IRubyObject self, RubyModule clazz, String name) { + IRubyObject proxy = oldNew.call(context, self, clazz, "new_proxy"); + proxy.dataWrapStruct(JavaObject.wrap(context.getRuntime(), null)); + return proxy; + } + }); concreteJavaProxy.addMethod("initialize", new org.jruby.internal.runtime.methods.JavaMethod(concreteJavaProxy, Visibility.PUBLIC) { @Override diff -ur jruby-1.4.0/src/org/jruby/javasupport/JavaClass.java jruby-1.4.0-typed_null/src/org/jruby/javasupport/JavaClass.java --- jruby-1.4.0/src/org/jruby/javasupport/JavaClass.java 2009-11-02 10:15:10.000000000 -0800 +++ jruby-1.4.0-typed_null/src/org/jruby/javasupport/JavaClass.java 2010-01-06 15:01:52.000000000 -0800 @@ -69,6 +69,7 @@ import org.jruby.common.IRubyWarnings.ID; import org.jruby.exceptions.RaiseException; import org.jruby.internal.runtime.methods.DynamicMethod; +import org.jruby.internal.runtime.methods.JavaMethod.JavaMethodZero; import org.jruby.java.addons.ArrayJavaAddons; import org.jruby.java.proxies.ArrayJavaProxy; import org.jruby.java.invokers.ConstructorInvoker; diff -ur jruby-1.4.0/src/org/jruby/javasupport/Java.java jruby-1.4.0-typed_null/src/org/jruby/javasupport/Java.java --- jruby-1.4.0/src/org/jruby/javasupport/Java.java 2009-11-02 10:15:10.000000000 -0800 +++ jruby-1.4.0-typed_null/src/org/jruby/javasupport/Java.java 2010-01-06 15:01:52.000000000 -0800 @@ -468,6 +468,7 @@ proxyClass.inherit(superClass); } proxyClass.callMethod(runtime.getCurrentContext(), "java_class=", javaClass); + proxyClass.dataWrapStruct(javaClass.javaClass()); javaClass.setupProxy(proxyClass); // add java_method for unbound use diff -ur jruby-1.4.0/src/org/jruby/javasupport/JavaProxyMethods.java jruby-1.4.0-typed_null/src/org/jruby/javasupport/JavaProxyMethods.java --- jruby-1.4.0/src/org/jruby/javasupport/JavaProxyMethods.java 2009-11-02 10:15:10.000000000 -0800 +++ jruby-1.4.0-typed_null/src/org/jruby/javasupport/JavaProxyMethods.java 2010-01-06 15:01:52.000000000 -0800 @@ -1,6 +1,7 @@ package org.jruby.javasupport; import org.jruby.Ruby; +import org.jruby.RubyClass; import org.jruby.RubyModule; import org.jruby.RubyObject; import org.jruby.anno.JRubyMethod; diff -ur jruby-1.4.0/src/org/jruby/RubyBasicObject.java jruby-1.4.0-typed_null/src/org/jruby/RubyBasicObject.java --- jruby-1.4.0/src/org/jruby/RubyBasicObject.java 2009-11-02 10:15:08.000000000 -0800 +++ jruby-1.4.0-typed_null/src/org/jruby/RubyBasicObject.java 2010-01-06 15:14:37.000000000 -0800 @@ -34,6 +34,8 @@ import java.util.concurrent.atomic.AtomicBoolean; import org.jruby.anno.JRubyMethod; +import org.jruby.java.proxies.JavaProxy; +import org.jruby.javasupport.JavaClass; import org.jruby.javasupport.JavaObject; import org.jruby.javasupport.JavaUtil; import org.jruby.javasupport.util.RuntimeHelpers; @@ -582,10 +584,21 @@ * translations. */ public Class getJavaClass() { + if (this instanceof JavaProxy) { + RubyClass mc = getMetaClass(); + if (mc != null) + { + Class c = (Class) mc.dataGetStruct(); + if (c != null) + return c; + } + } + Object obj = dataGetStruct(); if (obj instanceof JavaObject) { return ((JavaObject)obj).getValue().getClass(); } + return getClass(); }