Class.forName can load new classes
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Sat, 15 Dec 2012 08:17:45 +0100
changeset 3223884815c0629
parent 321 1848c77df886
child 323 d41cfd77842d
child 324 46db65995983
Class.forName can load new classes
emul/src/main/java/java/lang/Class.java
vm/src/main/java/org/apidesign/vm4brwsr/VM.java
vm/src/test/java/org/apidesign/vm4brwsr/tck/CompareStringsTest.java
     1.1 --- a/emul/src/main/java/java/lang/Class.java	Sat Dec 15 07:10:58 2012 +0100
     1.2 +++ b/emul/src/main/java/java/lang/Class.java	Sat Dec 15 08:17:45 2012 +0100
     1.3 @@ -144,18 +144,22 @@
     1.4       */
     1.5      public static Class<?> forName(String className)
     1.6                  throws ClassNotFoundException {
     1.7 -        Class<?> c = loadCls(className.replace('.', '_'));
     1.8 +        Class<?> c = loadCls(className, className.replace('.', '_'));
     1.9          if (c == null) {
    1.10              throw new ClassNotFoundException();
    1.11          }
    1.12          return c;
    1.13      }
    1.14      
    1.15 -    @JavaScriptBody(args = "c", body =
    1.16 -        "if (vm[c]) return vm[c].$class;"
    1.17 -      + "else return null;"
    1.18 +    @JavaScriptBody(args = {"n", "c" }, body =
    1.19 +        "if (vm[c]) return vm[c].$class;\n"
    1.20 +      + "if (vm.loadClass) {\n"
    1.21 +      + "  vm.loadClass(n);\n"
    1.22 +      + "  if (vm[c]) return vm[c].$class;\n"
    1.23 +      + "}\n"
    1.24 +      + "return null;"
    1.25      )
    1.26 -    private static native Class<?> loadCls(String c);
    1.27 +    private static native Class<?> loadCls(String n, String c);
    1.28  
    1.29  
    1.30      /**
     2.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/VM.java	Sat Dec 15 07:10:58 2012 +0100
     2.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/VM.java	Sat Dec 15 08:17:45 2012 +0100
     2.3 @@ -119,6 +119,7 @@
     2.4              + "      return vm.org_apidesign_vm4brwsr_VMLazy(false).\n"
     2.5              + "        load___3Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_String_2_3Ljava_lang_Object_2(loader, name, args);\n"
     2.6              + "    }\n"
     2.7 +            + "    if (args[0]) vm.loadClass = loader.loadClass;\n"
     2.8              + "    return loader;\n"
     2.9              + "  };\n");
    2.10          out.append("}(this));");
     3.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/tck/CompareStringsTest.java	Sat Dec 15 07:10:58 2012 +0100
     3.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/tck/CompareStringsTest.java	Sat Dec 15 08:17:45 2012 +0100
     3.3 @@ -17,6 +17,7 @@
     3.4   */
     3.5  package org.apidesign.vm4brwsr.tck;
     3.6  
     3.7 +import java.lang.reflect.Method;
     3.8  import org.apidesign.vm4brwsr.Compare;
     3.9  import org.apidesign.vm4brwsr.CompareVMs;
    3.10  import org.testng.annotations.Factory;
    3.11 @@ -39,7 +40,10 @@
    3.12      @Compare public String nameOfStringClass() throws Exception {
    3.13          return Class.forName("java.lang.String").getName();
    3.14      }
    3.15 -    
    3.16 +    @Compare public String nameOfArrayClass() throws Exception {
    3.17 +        return Class.forName("org.apidesign.vm4brwsr.Array").getName();
    3.18 +    }
    3.19 +        
    3.20      @Factory
    3.21      public static Object[] create() {
    3.22          return CompareVMs.create(CompareStringsTest.class);