Properly handle Object methods in AutoBeanFactory in the JVM

This fixes a ClassCastException when calling #toString(): the
factory handler assumed any method other than the ones
explicitly handled would be returning a parameterized type
(AutoBean<Foo>).

Additionally it also makes it possible to invoke #hashCode()
and #equals().

Change-Id: I140c9b2c56ed2e632a06433d38c3e1daaea11025
diff --git a/user/src/com/google/web/bindery/autobean/vm/impl/FactoryHandler.java b/user/src/com/google/web/bindery/autobean/vm/impl/FactoryHandler.java
index 8532f41..e80fd8a 100644
--- a/user/src/com/google/web/bindery/autobean/vm/impl/FactoryHandler.java
+++ b/user/src/com/google/web/bindery/autobean/vm/impl/FactoryHandler.java
@@ -50,6 +50,11 @@
     Class<?> beanType;
     Object toWrap = null;
     String name = method.getName();
+    if (BeanMethod.OBJECT.matches(method)) {
+      // Redirect all methods of Object early on
+      return method.invoke(this, args);
+    }
+
     if (name.equals("create")) {
       // Dynamic create. Guaranteed to have at least one argument
       // create(clazz); or create(clazz, toWrap);
diff --git a/user/test/com/google/web/bindery/autobean/gwt/client/AutoBeanTest.java b/user/test/com/google/web/bindery/autobean/gwt/client/AutoBeanTest.java
index bc9a6c5..76150f1 100644
--- a/user/test/com/google/web/bindery/autobean/gwt/client/AutoBeanTest.java
+++ b/user/test/com/google/web/bindery/autobean/gwt/client/AutoBeanTest.java
@@ -584,6 +584,20 @@
     }
   }
 
+  public void testFactoryToString() {
+    assertNotNull(factory.toString());
+  }
+
+  public void testFactoryHashCode() {
+    assertTrue(factory.hashCode() != 0);
+    assertEquals(factory.hashCode(), factory.hashCode());
+  }
+
+  public void testFactoryEquals() {
+    assertFalse(factory.equals(null));
+    assertTrue(factory.equals(factory));
+  }
+
   @Override
   protected void gwtSetUp() throws Exception {
     factory = GWT.create(Factory.class);