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

Rémi Forax forax at univ-mlv.fr
Fri Jul 10 00:48:41 UTC 2009


This request seems dangerous,
InvocationTargetException should not be retrofitted because
usually its catch block is different from the others.
As is, this patch will introduce more burden than it tries to revolve.

Let me try to explain, all other exceptions can be avoided by checking 
modifiers,
knowing that the class exists in the bundle, etc but 
InvocationTargetException
means that the method/constructor raises an error (checked or not)
and we have no way to predict if this exception will be thrown or not.
Sothe catch block is very specific, it does something
like re-throwing uncheked exception, manages checked exceptions
declared in the signature of the method and wrap in 
UndeclaredThrowableException
checked exception that should not occurs.

John Rose recently proposes on coin-dev list a method that can be included
in the JDK, see
http://mail.openjdk.java.net/pipermail/coin-dev/2009-June/001954.html
to simplify catch blocks that catch an InvocationTargetException.

Rémi


Martin Buchholz a écrit :
> 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
>
> -----
> Start paragraphs on new lines.
>
> +     * and cause.  <p>Note that the detail message associated with
> -----
> Otherwise, looks good!
>
> 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