emul/src/main/java/java/lang/reflect/Array.java
branchArrayReflect
changeset 480 dfebf4fbb711
parent 479 34931e381886
child 482 05a87bc23192
     1.1 --- a/emul/src/main/java/java/lang/reflect/Array.java	Fri Jan 18 17:04:16 2013 +0100
     1.2 +++ b/emul/src/main/java/java/lang/reflect/Array.java	Fri Jan 18 18:35:17 2013 +0100
     1.3 @@ -143,7 +143,12 @@
     1.4       */
     1.5      public static Object newInstance(Class<?> componentType, int... dimensions)
     1.6          throws IllegalArgumentException, NegativeArraySizeException {
     1.7 -        return multiNewArray(componentType, dimensions);
     1.8 +        StringBuilder sig = new StringBuilder();
     1.9 +        for (int i = 1; i < dimensions.length; i++) {
    1.10 +            sig.append('[');
    1.11 +        }
    1.12 +        sig.append(findSignature(componentType));
    1.13 +        return multiNewArray(sig.toString(), dimensions, 0);
    1.14      }
    1.15  
    1.16      /**
    1.17 @@ -521,9 +526,18 @@
    1.18      )
    1.19      private static native Object newArray(boolean primitive, String sig, int length);
    1.20  
    1.21 -    private static native Object multiNewArray(Class componentType,
    1.22 -        int[] dimensions)
    1.23 -        throws IllegalArgumentException, NegativeArraySizeException;
    1.24 +    private static Object multiNewArray(String sig, int[] dims, int index)
    1.25 +    throws IllegalArgumentException, NegativeArraySizeException {
    1.26 +        if (dims.length == index + 1) {
    1.27 +            return newArray(sig.length() == 2, sig, dims[index]);
    1.28 +        }
    1.29 +        Object[] arr = (Object[]) newArray(false, sig, dims[index]);
    1.30 +        String compsig = sig.substring(1);
    1.31 +        for (int i = 0; i < arr.length; i++) {
    1.32 +            arr[i] = multiNewArray(compsig, dims, index + 1);
    1.33 +        }
    1.34 +        return arr;
    1.35 +    }
    1.36  
    1.37  
    1.38