hg: jdk8/tl/jdk: 7194897: JSR 292: Cannot create more than 16 instances of an anonymous class; ...

Peter Levart peter.levart at gmail.com
Tue Nov 5 01:28:31 PST 2013


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.field at 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.franck at oracle.com,brian.goetz at oracle.com,robert.field at 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
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20131105/6c9788f6/attachment.html 


More information about the compiler-dev mailing list