Hi Peter, I filed: https://bugs.openjdk.java.net/browse/JDK-8029100
Thanks! cheers /Joel On 2013-11-05, Peter Levart wrote: > Hi John, > > Speaking of names, the following test: > > package pkg; > > public class Test { > public static void main(String[] args) > { > Runnable r = () -> {}; > Class<?> c = r.getClass(); > Class<?> ac = java.lang.reflect.Array.newInstance(c, 0).getClass(); > System.out.println("c: " + c.getName() + " / " + > c.getSimpleName()); > System.out.println("ac: " + ac.getName() + " / " + > ac.getSimpleName()); > } > } > > > Prints: > > c: pkg.Test$$Lambda$1/798154996 / Test$$Lambda$1/798154996 > ac: [Lpkg.Test$$Lambda$1; / Test$$Lambda$1/798154996[] > > > I think the array class name is missing the trailing '/798154996' > just before ';' > > > Regards, Peter > > On 11/05/2013 09:55 AM, Peter Levart wrote: > >On 11/04/2013 07:12 PM, robert.fi...@oracle.com wrote: > >>Changeset: 51b002381b35 > >>Author: rfield > >>Date: 2013-11-04 10:12 -0800 > >>URL:http://hg.openjdk.java.net/jdk8/tl/jdk/rev/51b002381b35 > >> > >>7194897: JSR 292: Cannot create more than 16 instances of an anonymous class > >>8027681: Lambda serialization fails once reflection proxy generation kicks > >>in > >>Reviewed-by: ksrini, briangoetz, jfranck > >>Contributed-by:joel.fra...@oracle.com,brian.go...@oracle.com,robert.fi...@oracle.com > >> > >>! src/share/classes/sun/reflect/NativeConstructorAccessorImpl.java > >>! src/share/classes/sun/reflect/NativeMethodAccessorImpl.java > >>! src/share/classes/sun/reflect/misc/ReflectUtil.java > >>+ test/java/lang/invoke/lambda/RepetitiveLambdaSerialization.java > >>! > >>test/java/util/stream/test/org/openjdk/tests/java/lang/invoke/SerializedLambdaTest.java > >>+ test/sun/reflect/AnonymousNewInstance/ManyNewInstanceAnonTest.java > >> > >Hi Robert, > > > >I also propose a much faster variant of: > > > >+ /** > >+ * Checks if {@code Class cls} is a VM-anonymous class > >+ * as defined by {@link sun.misc.Unsafe#defineAnonymousClass} > >+ * (not to be confused with a Java Language anonymous inner class). > >+ */ > >+ public static boolean isVMAnonymousClass(Class<?> cls) { > >+ return cls.getSimpleName().contains("/"); > >+ } > > > > > >The following: > > > > public static boolean isVMAnonymousClassFAST(Class<?> cls) { > > String name = cls.getName(); > > for (int i = name.length() - 1; i >= 0; i--) { > > char c = name.charAt(i); > > if (c == '.') return false; > > if (c == '/') return true; > > } > > return false; // root package > > } > > > >It's about 12..25x faster for typical class names and doesn't > >produce any garbage. > > > > > >Regards, Peter > > >