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.da...@sun.com
<mailto:joe.da...@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);
+ }
+}