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