src/share/classes/java/lang/Class.java

Print this page

        

@@ -287,38 +287,26 @@
      * any exception thrown by the constructor in a (checked) {@link
      * java.lang.reflect.InvocationTargetException}.
      *
      * @return     a newly allocated instance of the class represented by this
      *             object.
-     * @exception  IllegalAccessException  if the class or its nullary
+     * @throws  IllegalAccessException  if the class or its nullary
      *               constructor is not accessible.
-     * @exception  InstantiationException
+     * @throws  InstantiationException
      *               if this {@code Class} represents an abstract class,
      *               an interface, an array class, a primitive type, or void;
      *               or if the class has no nullary constructor;
      *               or if the instantiation fails for some other reason.
-     * @exception  ExceptionInInitializerError if the initialization
+     * @throws  ExceptionInInitializerError if the initialization
      *               provoked by this method fails.
-     * @exception  SecurityException
-     *             If a security manager, <i>s</i>, is present and any of the
-     *             following conditions is met:
-     *
-     *             <ul>
-     *
-     *             <li> invocation of
-     *             {@link SecurityManager#checkMemberAccess
-     *             s.checkMemberAccess(this, Member.PUBLIC)} denies
-     *             creation of new instances of this class
-     *
-     *             <li> the caller's class loader is not the same as or an
+     * @throws  SecurityException
+     *          If a security manager, <i>s</i>, is present and
+     *          the caller's class loader is not the same as or an
      *             ancestor of the class loader for the current class and
      *             invocation of {@link SecurityManager#checkPackageAccess
      *             s.checkPackageAccess()} denies access to the package
-     *             of this class
-     *
-     *             </ul>
-     *
+     *          of this class.
      */
     public T newInstance()
         throws InstantiationException, IllegalAccessException
     {
         if (System.getSecurityManager() != null) {

@@ -1275,35 +1263,21 @@
      * this {@code Class} object represents a primitive type, an array
      * class, or void.
      *
      * @return the array of {@code Class} objects representing the public
      * members of this class
-     * @exception  SecurityException
-     *             If a security manager, <i>s</i>, is present and any of the
-     *             following conditions is met:
-     *
-     *             <ul>
-     *
-     *             <li> invocation of
-     *             {@link SecurityManager#checkMemberAccess
-     *             s.checkMemberAccess(this, Member.PUBLIC)} method
-     *             denies access to the classes within this class
-     *
-     *             <li> the caller's class loader is not the same as or an
+     * @throws SecurityException
+     *         If a security manager, <i>s</i>, is present and
+     *         the caller's class loader is not the same as or an
      *             ancestor of the class loader for the current class and
      *             invocation of {@link SecurityManager#checkPackageAccess
      *             s.checkPackageAccess()} denies access to the package
-     *             of this class
-     *
-     *             </ul>
+     *         of this class.
      *
      * @since JDK1.1
      */
     public Class<?>[] getClasses() {
-        // be very careful not to change the stack depth of this
-        // checkMemberAccess call for security reasons
-        // see java.lang.SecurityManager.checkMemberAccess
         checkMemberAccess(Member.PUBLIC, ClassLoader.getCallerClassLoader(), false);
 
         // Privileged so this implementation can look at DECLARED classes,
         // something the caller might not have privilege to do.  The code here
         // is allowed to look at DECLARED classes because (1) it does not hand

@@ -1350,35 +1324,22 @@
      *
      * <p> See <em>The Java Language Specification</em>, sections 8.2 and 8.3.
      *
      * @return the array of {@code Field} objects representing the
      * public fields
-     * @exception  SecurityException
-     *             If a security manager, <i>s</i>, is present and any of the
-     *             following conditions is met:
      *
-     *             <ul>
-     *
-     *             <li> invocation of
-     *             {@link SecurityManager#checkMemberAccess
-     *             s.checkMemberAccess(this, Member.PUBLIC)} denies
-     *             access to the fields within this class
-     *
-     *             <li> the caller's class loader is not the same as or an
+     * @throws SecurityException
+     *         If a security manager, <i>s</i>, is present and
+     *         the caller's class loader is not the same as or an
      *             ancestor of the class loader for the current class and
      *             invocation of {@link SecurityManager#checkPackageAccess
      *             s.checkPackageAccess()} denies access to the package
-     *             of this class
-     *
-     *             </ul>
+     *         of this class.
      *
      * @since JDK1.1
      */
     public Field[] getFields() throws SecurityException {
-        // be very careful not to change the stack depth of this
-        // checkMemberAccess call for security reasons
-        // see java.lang.SecurityManager.checkMemberAccess
         checkMemberAccess(Member.PUBLIC, ClassLoader.getCallerClassLoader(), true);
         return copyFields(privateGetPublicFields(null));
     }
 
 

@@ -1401,35 +1362,21 @@
      *
      * <p> See <em>The Java Language Specification</em>, sections 8.2 and 8.4.
      *
      * @return the array of {@code Method} objects representing the
      * public methods of this class
-     * @exception  SecurityException
-     *             If a security manager, <i>s</i>, is present and any of the
-     *             following conditions is met:
-     *
-     *             <ul>
-     *
-     *             <li> invocation of
-     *             {@link SecurityManager#checkMemberAccess
-     *             s.checkMemberAccess(this, Member.PUBLIC)} denies
-     *             access to the methods within this class
-     *
-     *             <li> the caller's class loader is not the same as or an
+     * @throws SecurityException
+     *         If a security manager, <i>s</i>, is present and
+     *         the caller's class loader is not the same as or an
      *             ancestor of the class loader for the current class and
      *             invocation of {@link SecurityManager#checkPackageAccess
      *             s.checkPackageAccess()} denies access to the package
-     *             of this class
-     *
-     *             </ul>
+     *         of this class.
      *
      * @since JDK1.1
      */
     public Method[] getMethods() throws SecurityException {
-        // be very careful not to change the stack depth of this
-        // checkMemberAccess call for security reasons
-        // see java.lang.SecurityManager.checkMemberAccess
         checkMemberAccess(Member.PUBLIC, ClassLoader.getCallerClassLoader(), true);
         return copyMethods(privateGetPublicMethods());
     }
 
 

@@ -1450,35 +1397,21 @@
      * different classes, which would violate the type guarantees of
      * {@code Constructor<T>[]}.
      *
      * @return the array of {@code Constructor} objects representing the
      *  public constructors of this class
-     * @exception  SecurityException
-     *             If a security manager, <i>s</i>, is present and any of the
-     *             following conditions is met:
-     *
-     *             <ul>
-     *
-     *             <li> invocation of
-     *             {@link SecurityManager#checkMemberAccess
-     *             s.checkMemberAccess(this, Member.PUBLIC)} denies
-     *             access to the constructors within this class
-     *
-     *             <li> the caller's class loader is not the same as or an
+     * @throws SecurityException
+     *         If a security manager, <i>s</i>, is present and
+     *         the caller's class loader is not the same as or an
      *             ancestor of the class loader for the current class and
      *             invocation of {@link SecurityManager#checkPackageAccess
      *             s.checkPackageAccess()} denies access to the package
-     *             of this class
-     *
-     *             </ul>
+     *         of this class.
      *
      * @since JDK1.1
      */
     public Constructor<?>[] getConstructors() throws SecurityException {
-        // be very careful not to change the stack depth of this
-        // checkMemberAccess call for security reasons
-        // see java.lang.SecurityManager.checkMemberAccess
         checkMemberAccess(Member.PUBLIC, ClassLoader.getCallerClassLoader(), true);
         return copyConstructors(privateGetDeclaredConstructors(true));
     }
 
 

@@ -1505,39 +1438,25 @@
      * <p> See <em>The Java Language Specification</em>, sections 8.2 and 8.3.
      *
      * @param name the field name
      * @return  the {@code Field} object of this class specified by
      * {@code name}
-     * @exception NoSuchFieldException if a field with the specified name is
+     * @throws NoSuchFieldException if a field with the specified name is
      *              not found.
-     * @exception NullPointerException if {@code name} is {@code null}
-     * @exception  SecurityException
-     *             If a security manager, <i>s</i>, is present and any of the
-     *             following conditions is met:
-     *
-     *             <ul>
-     *
-     *             <li> invocation of
-     *             {@link SecurityManager#checkMemberAccess
-     *             s.checkMemberAccess(this, Member.PUBLIC)} denies
-     *             access to the field
-     *
-     *             <li> the caller's class loader is not the same as or an
+     * @throws NullPointerException if {@code name} is {@code null}
+     * @throws SecurityException
+     *         If a security manager, <i>s</i>, is present and
+     *         the caller's class loader is not the same as or an
      *             ancestor of the class loader for the current class and
      *             invocation of {@link SecurityManager#checkPackageAccess
      *             s.checkPackageAccess()} denies access to the package
-     *             of this class
-     *
-     *             </ul>
+     *         of this class.
      *
      * @since JDK1.1
      */
     public Field getField(String name)
         throws NoSuchFieldException, SecurityException {
-        // be very careful not to change the stack depth of this
-        // checkMemberAccess call for security reasons
-        // see java.lang.SecurityManager.checkMemberAccess
         checkMemberAccess(Member.PUBLIC, ClassLoader.getCallerClassLoader(), true);
         Field field = getField0(name);
         if (field == null) {
             throw new NoSuchFieldException(name);
         }

@@ -1590,39 +1509,25 @@
      *
      * @param name the name of the method
      * @param parameterTypes the list of parameters
      * @return the {@code Method} object that matches the specified
      * {@code name} and {@code parameterTypes}
-     * @exception NoSuchMethodException if a matching method is not found
+     * @throws NoSuchMethodException if a matching method is not found
      *            or if the name is "&lt;init&gt;"or "&lt;clinit&gt;".
-     * @exception NullPointerException if {@code name} is {@code null}
-     * @exception  SecurityException
-     *             If a security manager, <i>s</i>, is present and any of the
-     *             following conditions is met:
-     *
-     *             <ul>
-     *
-     *             <li> invocation of
-     *             {@link SecurityManager#checkMemberAccess
-     *             s.checkMemberAccess(this, Member.PUBLIC)} denies
-     *             access to the method
-     *
-     *             <li> the caller's class loader is not the same as or an
+     * @throws NullPointerException if {@code name} is {@code null}
+     * @throws SecurityException
+     *         If a security manager, <i>s</i>, is present and
+     *         the caller's class loader is not the same as or an
      *             ancestor of the class loader for the current class and
      *             invocation of {@link SecurityManager#checkPackageAccess
      *             s.checkPackageAccess()} denies access to the package
-     *             of this class
-     *
-     *             </ul>
+     *         of this class.
      *
      * @since JDK1.1
      */
     public Method getMethod(String name, Class<?>... parameterTypes)
         throws NoSuchMethodException, SecurityException {
-        // be very careful not to change the stack depth of this
-        // checkMemberAccess call for security reasons
-        // see java.lang.SecurityManager.checkMemberAccess
         checkMemberAccess(Member.PUBLIC, ClassLoader.getCallerClassLoader(), true);
         Method method = getMethod0(name, parameterTypes);
         if (method == null) {
             throw new NoSuchMethodException(getName() + "." + name + argumentTypesToString(parameterTypes));
         }

@@ -1646,37 +1551,23 @@
      * types match those specified by {@code parameterTypes}.
      *
      * @param parameterTypes the parameter array
      * @return the {@code Constructor} object of the public constructor that
      * matches the specified {@code parameterTypes}
-     * @exception NoSuchMethodException if a matching method is not found.
-     * @exception  SecurityException
-     *             If a security manager, <i>s</i>, is present and any of the
-     *             following conditions is met:
-     *
-     *             <ul>
-     *
-     *             <li> invocation of
-     *             {@link SecurityManager#checkMemberAccess
-     *             s.checkMemberAccess(this, Member.PUBLIC)} denies
-     *             access to the constructor
-     *
-     *             <li> the caller's class loader is not the same as or an
+     * @throws NoSuchMethodException if a matching method is not found.
+     * @throws SecurityException
+     *         If a security manager, <i>s</i>, is present and
+     *         the caller's class loader is not the same as or an
      *             ancestor of the class loader for the current class and
      *             invocation of {@link SecurityManager#checkPackageAccess
      *             s.checkPackageAccess()} denies access to the package
-     *             of this class
-     *
-     *             </ul>
+     *         of this class.
      *
      * @since JDK1.1
      */
     public Constructor<T> getConstructor(Class<?>... parameterTypes)
         throws NoSuchMethodException, SecurityException {
-        // be very careful not to change the stack depth of this
-        // checkMemberAccess call for security reasons
-        // see java.lang.SecurityManager.checkMemberAccess
         checkMemberAccess(Member.PUBLIC, ClassLoader.getCallerClassLoader(), true);
         return getConstructor0(parameterTypes, Member.PUBLIC);
     }
 
 

@@ -1690,20 +1581,22 @@
      * interfaces as members, or if this {@code Class} object represents a
      * primitive type, an array class, or void.
      *
      * @return the array of {@code Class} objects representing all the
      * declared members of this class
-     * @exception  SecurityException
+     * @throws SecurityException
      *             If a security manager, <i>s</i>, is present and any of the
      *             following conditions is met:
      *
      *             <ul>
      *
-     *             <li> invocation of
-     *             {@link SecurityManager#checkMemberAccess
-     *             s.checkMemberAccess(this, Member.DECLARED)} denies
-     *             access to the declared classes within this class
+     *         <li> the caller's class loader is not the same as the
+     *         class loader of this class and invocation of
+     *         {@link SecurityManager#checkPermission
+     *         s.checkPermission} method with
+     *         {@code RuntimePermission("accessDeclaredMembers")}
+     *         denies access to the declared classes within this class
      *
      *             <li> the caller's class loader is not the same as or an
      *             ancestor of the class loader for the current class and
      *             invocation of {@link SecurityManager#checkPackageAccess
      *             s.checkPackageAccess()} denies access to the package

@@ -1712,13 +1605,10 @@
      *             </ul>
      *
      * @since JDK1.1
      */
     public Class<?>[] getDeclaredClasses() throws SecurityException {
-        // be very careful not to change the stack depth of this
-        // checkMemberAccess call for security reasons
-        // see java.lang.SecurityManager.checkMemberAccess
         checkMemberAccess(Member.DECLARED, ClassLoader.getCallerClassLoader(), false);
         return getDeclaredClasses0();
     }
 
 

@@ -1734,20 +1624,22 @@
      *
      * <p> See <em>The Java Language Specification</em>, sections 8.2 and 8.3.
      *
      * @return    the array of {@code Field} objects representing all the
      * declared fields of this class
-     * @exception  SecurityException
+     * @throws  SecurityException
      *             If a security manager, <i>s</i>, is present and any of the
      *             following conditions is met:
      *
      *             <ul>
      *
-     *             <li> invocation of
-     *             {@link SecurityManager#checkMemberAccess
-     *             s.checkMemberAccess(this, Member.DECLARED)} denies
-     *             access to the declared fields within this class
+     *          <li> the caller's class loader is not the same as the
+     *          class loader of this class and invocation of
+     *          {@link SecurityManager#checkPermission
+     *          s.checkPermission} method with
+     *          {@code RuntimePermission("accessDeclaredMembers")}
+     *          denies access to the declared fields within this class
      *
      *             <li> the caller's class loader is not the same as or an
      *             ancestor of the class loader for the current class and
      *             invocation of {@link SecurityManager#checkPackageAccess
      *             s.checkPackageAccess()} denies access to the package

@@ -1756,13 +1648,10 @@
      *             </ul>
      *
      * @since JDK1.1
      */
     public Field[] getDeclaredFields() throws SecurityException {
-        // be very careful not to change the stack depth of this
-        // checkMemberAccess call for security reasons
-        // see java.lang.SecurityManager.checkMemberAccess
         checkMemberAccess(Member.DECLARED, ClassLoader.getCallerClassLoader(), true);
         return copyFields(privateGetDeclaredFields(false));
     }
 
 

@@ -1782,20 +1671,22 @@
      *
      * <p> See <em>The Java Language Specification</em>, section 8.2.
      *
      * @return    the array of {@code Method} objects representing all the
      * declared methods of this class
-     * @exception  SecurityException
+     * @throws  SecurityException
      *             If a security manager, <i>s</i>, is present and any of the
      *             following conditions is met:
      *
      *             <ul>
      *
-     *             <li> invocation of
-     *             {@link SecurityManager#checkMemberAccess
-     *             s.checkMemberAccess(this, Member.DECLARED)} denies
-     *             access to the declared methods within this class
+     *          <li> the caller's class loader is not the same as the
+     *          class loader of this class and invocation of
+     *          {@link SecurityManager#checkPermission
+     *          s.checkPermission} method with
+     *          {@code RuntimePermission("accessDeclaredMembers")}
+     *          denies access to the declared methods within this class
      *
      *             <li> the caller's class loader is not the same as or an
      *             ancestor of the class loader for the current class and
      *             invocation of {@link SecurityManager#checkPackageAccess
      *             s.checkPackageAccess()} denies access to the package

@@ -1804,13 +1695,10 @@
      *             </ul>
      *
      * @since JDK1.1
      */
     public Method[] getDeclaredMethods() throws SecurityException {
-        // be very careful not to change the stack depth of this
-        // checkMemberAccess call for security reasons
-        // see java.lang.SecurityManager.checkMemberAccess
         checkMemberAccess(Member.DECLARED, ClassLoader.getCallerClassLoader(), true);
         return copyMethods(privateGetDeclaredMethods(false));
     }
 
 

@@ -1827,20 +1715,22 @@
      *
      * <p> See <em>The Java Language Specification</em>, section 8.2.
      *
      * @return    the array of {@code Constructor} objects representing all the
      * declared constructors of this class
-     * @exception  SecurityException
+     * @throws  SecurityException
      *             If a security manager, <i>s</i>, is present and any of the
      *             following conditions is met:
      *
      *             <ul>
      *
-     *             <li> invocation of
-     *             {@link SecurityManager#checkMemberAccess
-     *             s.checkMemberAccess(this, Member.DECLARED)} denies
-     *             access to the declared constructors within this class
+     *          <li> the caller's class loader is not the same as the
+     *          class loader of this class and invocation of
+     *          {@link SecurityManager#checkPermission
+     *          s.checkPermission} method with
+     *          {@code RuntimePermission("accessDeclaredMembers")}
+     *          denies access to the declared constructors within this class
      *
      *             <li> the caller's class loader is not the same as or an
      *             ancestor of the class loader for the current class and
      *             invocation of {@link SecurityManager#checkPackageAccess
      *             s.checkPackageAccess()} denies access to the package

@@ -1849,13 +1739,10 @@
      *             </ul>
      *
      * @since JDK1.1
      */
     public Constructor<?>[] getDeclaredConstructors() throws SecurityException {
-        // be very careful not to change the stack depth of this
-        // checkMemberAccess call for security reasons
-        // see java.lang.SecurityManager.checkMemberAccess
         checkMemberAccess(Member.DECLARED, ClassLoader.getCallerClassLoader(), true);
         return copyConstructors(privateGetDeclaredConstructors(false));
     }
 
 

@@ -1867,23 +1754,25 @@
      * will not reflect the {@code length} field of an array class.
      *
      * @param name the name of the field
      * @return the {@code Field} object for the specified field in this
      * class
-     * @exception NoSuchFieldException if a field with the specified name is
+     * @throws  NoSuchFieldException if a field with the specified name is
      *              not found.
-     * @exception NullPointerException if {@code name} is {@code null}
-     * @exception  SecurityException
+     * @throws  NullPointerException if {@code name} is {@code null}
+     * @throws  SecurityException
      *             If a security manager, <i>s</i>, is present and any of the
      *             following conditions is met:
      *
      *             <ul>
      *
-     *             <li> invocation of
-     *             {@link SecurityManager#checkMemberAccess
-     *             s.checkMemberAccess(this, Member.DECLARED)} denies
-     *             access to the declared field
+     *          <li> the caller's class loader is not the same as the
+     *          class loader of this class and invocation of
+     *          {@link SecurityManager#checkPermission
+     *          s.checkPermission} method with
+     *          {@code RuntimePermission("accessDeclaredMembers")}
+     *          denies access to the declared field
      *
      *             <li> the caller's class loader is not the same as or an
      *             ancestor of the class loader for the current class and
      *             invocation of {@link SecurityManager#checkPackageAccess
      *             s.checkPackageAccess()} denies access to the package

@@ -1893,13 +1782,10 @@
      *
      * @since JDK1.1
      */
     public Field getDeclaredField(String name)
         throws NoSuchFieldException, SecurityException {
-        // be very careful not to change the stack depth of this
-        // checkMemberAccess call for security reasons
-        // see java.lang.SecurityManager.checkMemberAccess
         checkMemberAccess(Member.DECLARED, ClassLoader.getCallerClassLoader(), true);
         Field field = searchFields(privateGetDeclaredFields(false), name);
         if (field == null) {
             throw new NoSuchFieldException(name);
         }

@@ -1923,22 +1809,24 @@
      *
      * @param name the name of the method
      * @param parameterTypes the parameter array
      * @return    the {@code Method} object for the method of this class
      * matching the specified name and parameters
-     * @exception NoSuchMethodException if a matching method is not found.
-     * @exception NullPointerException if {@code name} is {@code null}
-     * @exception  SecurityException
+     * @throws  NoSuchMethodException if a matching method is not found.
+     * @throws  NullPointerException if {@code name} is {@code null}
+     * @throws  SecurityException
      *             If a security manager, <i>s</i>, is present and any of the
      *             following conditions is met:
      *
      *             <ul>
      *
-     *             <li> invocation of
-     *             {@link SecurityManager#checkMemberAccess
-     *             s.checkMemberAccess(this, Member.DECLARED)} denies
-     *             access to the declared method
+     *          <li> the caller's class loader is not the same as the
+     *          class loader of this class and invocation of
+     *          {@link SecurityManager#checkPermission
+     *          s.checkPermission} method with
+     *          {@code RuntimePermission("accessDeclaredMembers")}
+     *          denies access to the declared method
      *
      *             <li> the caller's class loader is not the same as or an
      *             ancestor of the class loader for the current class and
      *             invocation of {@link SecurityManager#checkPackageAccess
      *             s.checkPackageAccess()} denies access to the package

@@ -1948,13 +1836,10 @@
      *
      * @since JDK1.1
      */
     public Method getDeclaredMethod(String name, Class<?>... parameterTypes)
         throws NoSuchMethodException, SecurityException {
-        // be very careful not to change the stack depth of this
-        // checkMemberAccess call for security reasons
-        // see java.lang.SecurityManager.checkMemberAccess
         checkMemberAccess(Member.DECLARED, ClassLoader.getCallerClassLoader(), true);
         Method method = searchMethods(privateGetDeclaredMethods(false), name, parameterTypes);
         if (method == null) {
             throw new NoSuchMethodException(getName() + "." + name + argumentTypesToString(parameterTypes));
         }

@@ -1974,21 +1859,23 @@
      * include the explicit enclosing instance as the first parameter.
      *
      * @param parameterTypes the parameter array
      * @return    The {@code Constructor} object for the constructor with the
      * specified parameter list
-     * @exception NoSuchMethodException if a matching method is not found.
-     * @exception  SecurityException
+     * @throws  NoSuchMethodException if a matching method is not found.
+     * @throws  SecurityException
      *             If a security manager, <i>s</i>, is present and any of the
      *             following conditions is met:
      *
      *             <ul>
      *
-     *             <li> invocation of
-     *             {@link SecurityManager#checkMemberAccess
-     *             s.checkMemberAccess(this, Member.DECLARED)} denies
-     *             access to the declared constructor
+     *          <li> the caller's class loader is not the same as the
+     *          class loader of this class and invocation of
+     *          {@link SecurityManager#checkPermission
+     *          s.checkPermission} method with
+     *          {@code RuntimePermission("accessDeclaredMembers")}
+     *          denies access to the declared constructor
      *
      *             <li> the caller's class loader is not the same as or an
      *             ancestor of the class loader for the current class and
      *             invocation of {@link SecurityManager#checkPackageAccess
      *             s.checkPackageAccess()} denies access to the package

@@ -1998,13 +1885,10 @@
      *
      * @since JDK1.1
      */
     public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
         throws NoSuchMethodException, SecurityException {
-        // be very careful not to change the stack depth of this
-        // checkMemberAccess call for security reasons
-        // see java.lang.SecurityManager.checkMemberAccess
         checkMemberAccess(Member.DECLARED, ClassLoader.getCallerClassLoader(), true);
         return getConstructor0(parameterTypes, Member.DECLARED);
     }
 
     /**

@@ -2164,21 +2048,26 @@
 
     /*
      * Check if client is allowed to access members.  If access is denied,
      * throw a SecurityException.
      *
-     * Be very careful not to change the stack depth of this checkMemberAccess
-     * call for security reasons.
-     * See java.lang.SecurityManager.checkMemberAccess.
-     *
      * <p> Default policy: allow all clients access with normal Java access
      * control.
      */
     private void checkMemberAccess(int which, ClassLoader ccl, boolean checkProxyInterfaces) {
         SecurityManager s = System.getSecurityManager();
         if (s != null) {
-            s.checkMemberAccess(this, which);
+            /* Default policy allows access to all {@link Member#PUBLIC} members,
+             * as well as access to classes that have the same class loader as the caller.
+             * In all other cases, it requires RuntimePermission("accessDeclaredMembers")
+             * permission.
+             */
+            if (which != Member.PUBLIC) {
+                if (ccl != this.getClassLoader()) {
+                    s.checkPermission(SecurityConstants.CHECK_MEMBER_ACCESS_PERMISSION);
+                }
+            }
             ClassLoader cl = getClassLoader0();
             if (ReflectUtil.needsPackageAccessCheck(ccl, cl)) {
                 String name = this.getName();
                 int i = name.lastIndexOf('.');
                 if (i != -1) {