On 11/05/2013 10:10 AM, Brian Goetz wrote:
Ineexof(char) sounds like as fast and simpler?
Well, indexOf(char) or lastIndexOf(char) searches for a single char. We
can do better searching backwards for two chars at the same time.
If the "name" of VM-anonymous class is always ending with pattern:
"slash followed by some decimal digits" then the following would be even
faster:
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 true;
if (c < '0' || c > '9') return false;
}
return false;
}
Regards, Peter
Sent from my iPhone
On Nov 5, 2013, at 8:55 AM, Peter Levart <peter.lev...@gmail.com
<mailto:peter.lev...@gmail.com>> 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