Code review request for 6857789: (reflect) Create common superclass of reflective exceptions

Joseph D. Darcy Joe.Darcy at Sun.COM
Fri Jul 10 22:13:51 UTC 2009


Martin Buchholz wrote:
> Thanks for this; I had a chance to use it in the past week,
> if it had been there.
>
> -----
> typo
>
> +     * Conqstructs a new exception with {@code null} as its detail

I caught this, but neglected to recreate the patch before sending the 
email.  I've spellchecked all the other comments.

>
> -----
> Start paragraphs on new lines.
>
> +     * and cause.  <p>Note that the detail message associated with
> -----

Yes, I started by copying over the constructor's text from 
java.lang.Exception, but there is no reason to not follow the current 
conventions for new code; I'll fix this before it goes back.

> Otherwise, looks good!

Thanks for the review,

-Joe

>
> Martin
>
> On Thu, Jul 9, 2009 at 15:47, Joseph D. Darcy <Joe.Darcy at sun.com 
> <mailto:Joe.Darcy at sun.com>> wrote:
>
>     Hello.
>
>     Please review the patch below to fix
>
>       6857789:  (reflect) Create common superclass of reflective
>     exceptions
>
>     Half a dozen checked exceptions thrown by methods in core
>     reflection don't have a superclass more specific than Exception,
>     requiring multiple catch blocks around code using core reflection
>     operations.    The fix is to change the direct superclass of the
>     checked exceptions in question to a new shared checked exception,
>     java.lang.ReflectiveOperationException.  This is useful whether or
>     not multi-catch is added as a language change in JDK 7.
>
>     Inserting a new level into the superclass hierarchy is a binary
>     compatible change (JLSv3 Chapter 13); the change should be
>     transparent other than to reflective operations that specifically
>     queried the superclass.   All the exception classes in question
>     already have explicit serialVersionUID fields so changing the
>     superclass will be compatible from a serialization perspective too.
>
>     (A ccc request for this change is in progress too.)
>
>     Thanks,
>
>     -Joe
>
>
>     --- old/src/share/classes/java/lang/ClassNotFoundException.java  
>      2009-07-09 14:38:05.000000000 -0700
>     +++ new/src/share/classes/java/lang/ClassNotFoundException.java  
>      2009-07-09 14:38:05.000000000 -0700
>     @@ -50,7 +50,7 @@
>      * @see     java.lang.ClassLoader#loadClass(java.lang.String, boolean)
>      * @since   JDK1.0
>      */
>     -public class ClassNotFoundException extends Exception {
>     +public class ClassNotFoundException extends
>     ReflectiveOperationException {
>        /**
>         * use serialVersionUID from JDK 1.1.X for interoperability
>         */
>     --- old/src/share/classes/java/lang/IllegalAccessException.java  
>      2009-07-09 14:38:06.000000000 -0700
>     +++ new/src/share/classes/java/lang/IllegalAccessException.java  
>      2009-07-09 14:38:06.000000000 -0700
>     @@ -56,7 +56,7 @@
>      * @see     java.lang.reflect.Constructor#newInstance(Object[])
>      * @since   JDK1.0
>      */
>     -public class IllegalAccessException extends Exception {
>     +public class IllegalAccessException extends
>     ReflectiveOperationException {
>        private static final long serialVersionUID = 6616958222490762034L;
>
>        /**
>     --- old/src/share/classes/java/lang/InstantiationException.java  
>      2009-07-09 14:38:06.000000000 -0700
>     +++ new/src/share/classes/java/lang/InstantiationException.java  
>      2009-07-09 14:38:06.000000000 -0700
>     @@ -43,7 +43,7 @@
>      * @since   JDK1.0
>      */
>     public
>     -class InstantiationException extends Exception {
>     +class InstantiationException extends ReflectiveOperationException {
>        private static final long serialVersionUID = -8441929162975509110L;
>
>        /**
>     --- old/src/share/classes/java/lang/NoSuchFieldException.java  
>      2009-07-09 14:38:07.000000000 -0700
>     +++ new/src/share/classes/java/lang/NoSuchFieldException.java  
>      2009-07-09 14:38:07.000000000 -0700
>     @@ -31,7 +31,7 @@
>      * @author  unascribed
>      * @since   JDK1.1
>      */
>     -public class NoSuchFieldException extends Exception {
>     +public class NoSuchFieldException extends
>     ReflectiveOperationException {
>        private static final long serialVersionUID = -6143714805279938260L;
>
>        /**
>     --- old/src/share/classes/java/lang/NoSuchMethodException.java  
>      2009-07-09 14:38:08.000000000 -0700
>     +++ new/src/share/classes/java/lang/NoSuchMethodException.java  
>      2009-07-09 14:38:07.000000000 -0700
>     @@ -32,7 +32,7 @@
>      * @since      JDK1.0
>      */
>     public
>     -class NoSuchMethodException extends Exception {
>     +class NoSuchMethodException extends ReflectiveOperationException {
>        private static final long serialVersionUID = 5034388446362600923L;
>
>        /**
>     ---
>     old/src/share/classes/java/lang/reflect/InvocationTargetException.java
>        2009-07-09 14:38:08.000000000 -0700
>     +++
>     new/src/share/classes/java/lang/reflect/InvocationTargetException.java
>        2009-07-09 14:38:08.000000000 -0700
>     @@ -39,7 +39,7 @@
>      * @see Method
>      * @see Constructor
>      */
>     -public class InvocationTargetException extends Exception {
>     +public class InvocationTargetException extends
>     ReflectiveOperationException {
>        /**
>         * Use serialVersionUID from JDK 1.1.X for interoperability
>         */
>     --- /dev/null    2009-07-06 20:02:10.000000000 -0700
>     +++
>     new/src/share/classes/java/lang/ReflectiveOperationException.java
>        2009-07-09 14:38:09.000000000 -0700
>     @@ -0,0 +1,88 @@
>     +/*
>     + * Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
>     + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
>     + *
>     + * This code is free software; you can redistribute it and/or
>     modify it
>     + * under the terms of the GNU General Public License version 2
>     only, as
>     + * published by the Free Software Foundation.  Sun designates this
>     + * particular file as subject to the "Classpath" exception as
>     provided
>     + * by Sun in the LICENSE file that accompanied this code.
>     + *
>     + * This code is distributed in the hope that it will be useful,
>     but WITHOUT
>     + * ANY WARRANTY; without even the implied warranty of
>     MERCHANTABILITY or
>     + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
>     License
>     + * version 2 for more details (a copy is included in the LICENSE
>     file that
>     + * accompanied this code).
>     + *
>     + * You should have received a copy of the GNU General Public
>     License version
>     + * 2 along with this work; if not, write to the Free Software
>     Foundation,
>     + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
>     + *
>     + * Please contact Sun Microsystems, Inc., 4150 Network Circle,
>     Santa Clara,
>     + * CA 95054 USA or visit www.sun.com <http://www.sun.com> if you
>     need additional information or
>     + * have any questions.
>     + */
>     +
>     +package java.lang;
>     +
>     +/**
>     + * Common superclass of exceptions thrown by reflective operations in
>     + * core reflection.
>     + *
>     + * @since 1.7
>     + */
>     +public class ReflectiveOperationException extends Exception {
>     +    static final long serialVersionUID = 123456789L;
>     +
>     +    /**
>     +     * Conqstructs a new exception with {@code null} as its detail
>     +     * message.  The cause is not initialized, and may
>     subsequently be
>     +     * initialized by a call to {@link #initCause}.
>     +     */
>     +    public ReflectiveOperationException() {
>     +        super();
>     +    }
>     +
>     +    /**
>     +     * Constructs a new exception with the specified detail message.
>     +     * The cause is not initialized, and may subsequently be
>     +     * initialized by a call to {@link #initCause}.
>     +     *
>     +     * @param   message   the detail message. The detail message
>     is saved for
>     +     *          later retrieval by the {@link #getMessage()} method.
>     +     */
>     +    public ReflectiveOperationException(String message) {
>     +        super(message);
>     +    }
>     +
>     +    /**
>     +     * Constructs a new exception with the specified detail message
>     +     * and cause.  <p>Note that the detail message associated with
>     +     * {@code cause} is <em>not</em> automatically incorporated in
>     +     * this exception's detail message.
>     +     *
>     +     * @param  message the detail message (which is saved for
>     later retrieval
>     +     *         by the {@link #getMessage()} method).
>     +     * @param  cause the cause (which is saved for later
>     retrieval by the
>     +     *         {@link #getCause()} method).  (A {@code null} value is
>     +     *         permitted, and indicates that the cause is
>     nonexistent or
>     +     *         unknown.)
>     +     */
>     +    public ReflectiveOperationException(String message, Throwable
>     cause) {
>     +        super(message, cause);
>     +    }
>     +
>     +    /**
>     +     * Constructs a new exception with the specified cause and a
>     detail
>     +     * message of {@code (cause==null ? null : cause.toString())}
>     (which
>     +     * typically contains the class and detail message of {@code
>     cause}).
>     +     *
>     +     * @param  cause the cause (which is saved for later
>     retrieval by the
>     +     *         {@link #getCause()} method).  (A {@code null} value is
>     +     *         permitted, and indicates that the cause is
>     nonexistent or
>     +     *         unknown.)
>     +     */
>     +    public ReflectiveOperationException(Throwable cause) {
>     +        super(cause);
>     +    }
>     +}
>
>
>




More information about the core-libs-dev mailing list