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


Reply via email to