--- old/src/java.base/share/classes/java/lang/Class.java 2015-01-14 17:01:16.836552449 -0800 +++ new/src/java.base/share/classes/java/lang/Class.java 2015-01-14 17:01:16.676552456 -0800 @@ -149,7 +149,8 @@ * {@code getName}. If this {@code Class} object represents a * primitive type, this method returns the name of the primitive type. If * this {@code Class} object represents void this method returns - * "void". + * "void". If this {@code Class} object presents an array type, + * this method returns "class " followed by {@code getName}. * * @return a string representation of this class object. */ @@ -174,6 +175,12 @@ * occur in canonical order. If there are no type parameters, the * type parameter list is elided. * + * For an array type, the string starts with the type name, + * followed by an angle-bracketed comma-separated list of the + * type's type parameters, if any, followed by a sequence of + * {@code []} characters, one set of brackets per dimension of + * the array. + * *

Note that since information about the runtime representation * of a type is being generated, modifiers not present on the * originating source code or illegal on the originating source @@ -189,29 +196,39 @@ return toString(); } else { StringBuilder sb = new StringBuilder(); + Class component = this; + int arrayDepth = 0; - // Class modifiers are a superset of interface modifiers - int modifiers = getModifiers() & Modifier.classModifiers(); - if (modifiers != 0) { - sb.append(Modifier.toString(modifiers)); - sb.append(' '); - } - - if (isAnnotation()) { - sb.append('@'); - } - if (isInterface()) { // Note: all annotation types are interfaces - sb.append("interface"); + if (isArray()) { + do { + arrayDepth++; + component = component.getComponentType(); + } while (component.isArray()); + sb.append(component.getName()); } else { - if (isEnum()) - sb.append("enum"); - else - sb.append("class"); + // Class modifiers are a superset of interface modifiers + int modifiers = getModifiers() & Modifier.classModifiers(); + if (modifiers != 0) { + sb.append(Modifier.toString(modifiers)); + sb.append(' '); + } + + if (isAnnotation()) { + sb.append('@'); + } + if (isInterface()) { // Note: all annotation types are interfaces + sb.append("interface"); + } else { + if (isEnum()) + sb.append("enum"); + else + sb.append("class"); + } + sb.append(' '); + sb.append(getName()); } - sb.append(' '); - sb.append(getName()); - TypeVariable[] typeparms = getTypeParameters(); + TypeVariable[] typeparms = component.getTypeParameters(); if (typeparms.length > 0) { boolean first = true; sb.append('<'); @@ -224,6 +241,9 @@ sb.append('>'); } + for (int i = 0; i < arrayDepth; i++) + sb.append("[]"); + return sb.toString(); } } --- old/test/java/lang/Class/GenericStringTest.java 2015-01-14 17:01:17.292552430 -0800 +++ new/test/java/lang/Class/GenericStringTest.java 2015-01-14 17:01:17.132552437 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,10 +34,26 @@ @ExpectedGenericString("public class GenericStringTest") public class GenericStringTest { - public static void main(String... args){ + public Map[] mixed = null; + + public static void main(String... args) throws ReflectiveOperationException { int failures = 0; + String[][] nested = {{""}}; + int[][] intArray = {{1}}; + failures += checkToGenericString(int.class, "int"); + failures += checkToGenericString(void.class, "void"); + failures += checkToGenericString(args.getClass(), "java.lang.String[]"); + failures += checkToGenericString(nested.getClass(), "java.lang.String[][]"); + failures += checkToGenericString(intArray.getClass(), "int[][]"); + failures += checkToGenericString(java.util.Map.class, "public abstract interface java.util.Map"); + + Field f = GenericStringTest.class.getDeclaredField("mixed"); + // The expected value includes "" rather than + // "<...String,...Integer>" since the Class object rather than + // Type objects is being queried. + failures += checkToGenericString(f.getType(), "java.util.Map[]"); Class[] types = { GenericStringTest.class,