[9] RFR (S): Class.getSimpleName() should work for non-JLS compliant class names

Vladimir Ivanov vladimir.x.ivanov at oracle.com
Wed Apr 8 15:41:15 UTC 2015


http://cr.openjdk.java.net/~vlivanov/8057919/webrev.00/jdk
http://cr.openjdk.java.net/~vlivanov/8057919/webrev.00/hotspot
https://bugs.openjdk.java.net/browse/JDK-8057919

The logic to compute simple name (Class.getSimpleName()) for 
inner/nested/local classes is tightly coupled with Java naming scheme 
and sometimes fails for classes generated from non-Java code.

Instead of parsing class name and try to extract simple name based on 
JLS rules, the fix I propose is to use InnerClasses attribute from the 
class file. Simple name is already recorded there.

JVMS-4.7.6: The InnerClasses Attribute
"inner_name_index: If C is anonymous (JLS §15.9.5), the value of the 
inner_name_index item must be zero. Otherwise, the value of the 
inner_name_index item must be a valid index into the constant_pool 
table, and the entry at that index must be a CONSTANT_Utf8_info 
structure (§4.4.7) that represents the original simple name of C, as 
given in the source code from which this class file was compiled."

Since I consider backporting the fix into 8u60, I'd like to hear 
opinions about backward compatibility of such change.

As an alternative solution, I can restore original logic and consult 
InnerClasses attribute when class name parsing logic fails.

Testing: regression test, jck-runtime/java_lang, jdk/test/java/lang/

Thanks!

Best regards,
Vladimir Ivanov



More information about the core-libs-dev mailing list