rt/emul/mini/src/main/java/java/lang/Class.java
changeset 1898 cf6d5d357696
parent 1887 6b74e398466d
child 1899 d729cfa77fa7
     1.1 --- a/rt/emul/mini/src/main/java/java/lang/Class.java	Sat Mar 19 08:45:39 2016 +0100
     1.2 +++ b/rt/emul/mini/src/main/java/java/lang/Class.java	Sun Mar 20 08:12:55 2016 +0100
     1.3 @@ -721,15 +721,12 @@
     1.4       * class.
     1.5       */
     1.6      private String getSimpleBinaryName() {
     1.7 -        Class<?> enclosingClass = null; // XXX getEnclosingClass();
     1.8 -        if (enclosingClass == null) // top level class
     1.9 +        final String name = getName();
    1.10 +        int dolar = name.lastIndexOf('$');
    1.11 +        if (dolar == -1) {
    1.12              return null;
    1.13 -        // Otherwise, strip the enclosing class' name
    1.14 -        try {
    1.15 -            return getName().substring(enclosingClass.getName().length());
    1.16 -        } catch (IndexOutOfBoundsException ex) {
    1.17 -            throw new IllegalStateException("Malformed class name");
    1.18          }
    1.19 +        return name.substring(dolar);
    1.20      }
    1.21  
    1.22      /**
    1.23 @@ -1350,8 +1347,8 @@
    1.24              else
    1.25                  return null;
    1.26          }
    1.27 -//        if (isLocalOrAnonymousClass())
    1.28 -//            return null;
    1.29 +        if (isLocalOrAnonymousClass())
    1.30 +            return null;
    1.31  //        Class<?> enclosingClass = getEnclosingClass();
    1.32          Class<?> enclosingClass = null;
    1.33          if (enclosingClass == null) { // top level class
    1.34 @@ -1365,6 +1362,47 @@
    1.35      }
    1.36  
    1.37      /**
    1.38 +     * Returns {@code true} if and only if the underlying class is an anonymous
    1.39 +     * class.
    1.40 +     *
    1.41 +     * @return {@code true} if and only if this class is an anonymous class.
    1.42 +     * @since 1.5
    1.43 +     */
    1.44 +    public boolean isAnonymousClass() {
    1.45 +        return "".equals(getSimpleName());
    1.46 +    }
    1.47 +
    1.48 +    /**
    1.49 +     * Returns {@code true} if and only if the underlying class is a local
    1.50 +     * class.
    1.51 +     *
    1.52 +     * @return {@code true} if and only if this class is a local class.
    1.53 +     * @since 1.5
    1.54 +     */
    1.55 +    public boolean isLocalClass() {
    1.56 +        return isLocalOrAnonymousClass() && !isAnonymousClass();
    1.57 +    }
    1.58 +
    1.59 +    /**
    1.60 +     * Returns {@code true} if and only if the underlying class is a member
    1.61 +     * class.
    1.62 +     *
    1.63 +     * @return {@code true} if and only if this class is a member class.
    1.64 +     * @since 1.5
    1.65 +     */
    1.66 +    public boolean isMemberClass() {
    1.67 +        return getSimpleBinaryName() != null && !isLocalOrAnonymousClass();
    1.68 +    }
    1.69 +
    1.70 +    /**
    1.71 +     * Returns {@code true} if this is a local class or an anonymous class.
    1.72 +     * Returns {@code false} otherwise.
    1.73 +     */
    1.74 +    private boolean isLocalOrAnonymousClass() {
    1.75 +        return (getAccess() & 0x10000) != 0;
    1.76 +    }
    1.77 +
    1.78 +    /**
    1.79       * Finds a resource with a given name.  The rules for searching resources
    1.80       * associated with a given class are implemented by the defining
    1.81       * {@linkplain ClassLoader class loader} of the class.  This method