< prev index next >
src/java.base/share/classes/java/lang/Class.java
Print this page
*** 1310,1320 ****
// c) Inner classes (non-static member classes)
// d) Local classes (named classes declared within a method)
// e) Anonymous classes
! // JVM Spec 4.8.6: A class must have an EnclosingMethod
// attribute if and only if it is a local class or an
// anonymous class.
EnclosingMethodInfo enclosingInfo = getEnclosingMethodInfo();
Class<?> enclosingCandidate;
--- 1310,1320 ----
// c) Inner classes (non-static member classes)
// d) Local classes (named classes declared within a method)
// e) Anonymous classes
! // JVM Spec 4.7.7: A class must have an EnclosingMethod
// attribute if and only if it is a local class or an
// anonymous class.
EnclosingMethodInfo enclosingInfo = getEnclosingMethodInfo();
Class<?> enclosingCandidate;
*** 1355,1386 ****
String simpleName = getSimpleBinaryName();
if (simpleName == null) { // top level class
simpleName = getName();
return simpleName.substring(simpleName.lastIndexOf('.')+1); // strip the package name
}
! // According to JLS3 "Binary Compatibility" (13.1) the binary
! // name of non-package classes (not top level) is the binary
! // name of the immediately enclosing class followed by a '$' followed by:
! // (for nested and inner classes): the simple name.
! // (for local classes): 1 or more digits followed by the simple name.
! // (for anonymous classes): 1 or more digits.
!
! // Since getSimpleBinaryName() will strip the binary name of
! // the immediately enclosing class, we are now looking at a
! // string that matches the regular expression "\$[0-9]*"
! // followed by a simple name (considering the simple of an
! // anonymous class to be the empty string).
!
! // Remove leading "\$[0-9]*" from the name
! int length = simpleName.length();
! if (length < 1 || simpleName.charAt(0) != '$')
! throw new InternalError("Malformed class name");
! int index = 1;
! while (index < length && isAsciiDigit(simpleName.charAt(index)))
! index++;
! // Eventually, this is the empty string iff this is an anonymous class
! return simpleName.substring(index);
}
/**
* Return an informative string for the name of this type.
*
--- 1355,1365 ----
String simpleName = getSimpleBinaryName();
if (simpleName == null) { // top level class
simpleName = getName();
return simpleName.substring(simpleName.lastIndexOf('.')+1); // strip the package name
}
! return simpleName;
}
/**
* Return an informative string for the name of this type.
*
*** 1487,1510 ****
*/
private String getSimpleBinaryName() {
Class<?> enclosingClass = getEnclosingClass();
if (enclosingClass == null) // top level class
return null;
! // Otherwise, strip the enclosing class' name
! try {
! return getName().substring(enclosingClass.getName().length());
! } catch (IndexOutOfBoundsException ex) {
! throw new InternalError("Malformed class name", ex);
! }
}
/**
* Returns {@code true} if this is a local class or an anonymous
* class. Returns {@code false} otherwise.
*/
private boolean isLocalOrAnonymousClass() {
! // JVM Spec 4.8.6: A class must have an EnclosingMethod
// attribute if and only if it is a local class or an
// anonymous class.
return getEnclosingMethodInfo() != null;
}
--- 1466,1489 ----
*/
private String getSimpleBinaryName() {
Class<?> enclosingClass = getEnclosingClass();
if (enclosingClass == null) // top level class
return null;
! String name = getSimpleBinaryName0();
! if (name == null) // anonymous class
! return "";
! return name;
}
+ private native String getSimpleBinaryName0();
+
/**
* Returns {@code true} if this is a local class or an anonymous
* class. Returns {@code false} otherwise.
*/
private boolean isLocalOrAnonymousClass() {
! // JVM Spec 4.7.7: A class must have an EnclosingMethod
// attribute if and only if it is a local class or an
// anonymous class.
return getEnclosingMethodInfo() != null;
}
< prev index next >