JDK 9 RFR of JDK-8159330: Improve deprecation text for Class.newInstance
joe darcy
joe.darcy at oracle.com
Mon Jun 13 16:37:09 UTC 2016
Hi Roger,
On 6/13/2016 6:59 AM, Roger Riggs wrote:
> Hi,
>
> That example kind of glosses over the need to handle 3 new exceptions.
> That's been my annoyance with this change.
>
> throws InstantiationException, IllegalAccessException,
> InvocationTargetException
The patch sent to the list
(http://mail.openjdk.java.net/pipermail/core-libs-dev/2016-June/041754.html),
did note addition exception types are thrown by the replacement code.
The proposed text with Max's improvement is
+ * <p>The call
+ *
+ * <pre>{@code
+ * clazz.newInstance()
+ * }</pre>
+ *
+ * can be replaced by
+ *
+ * <pre>{@code
+ * clazz.getConstructor().newInstance()
+ * }</pre>
+ *
+ * The latter sequence of calls is inferred to be able to throw
+ * the additional exception types {@link
+ * InvocationTargetException} and {@link
+ * NoSuchMethodException}. Both of these exception types are
+ * subclasses of {@link ReflectiveOperationException}.
+ *
Class.newInstance is declared to throw InstantiationException and
IllegalAccessException. Its implementation internally catches
NoSuchMethodException and rethrows it as something else.
I considered adding more text to guide developers more explicitly to
either use multi-catch
catch(InstantiationException | IllegalAccessException e) =>
catch(InstantiationException | IllegalAccessException |
InvocationTargetException | NoSuchMethodException e)
or catching ReflectiveOperationException
catch(InstantiationException | IllegalAccessException e) =>
catch(ReflectiveOperationException e) =>
With the more precise rethrow feature added in 7, catching
ReflectiveOperationException and then rethrowing it doesn't lose any
type information.
I was hesitant to add such text as to not overwhelm further the
non-deprecated text of the method. However, if people think such
guidance is warranted, I'll craft something.
Thanks,
-Joe
>
> Roger
>
>
>
> On 6/12/2016 11:43 PM, joe darcy wrote:
>>
>> On 6/12/2016 7:21 PM, Wang Weijun wrote:
>>> Why not just clazz.getConstructor().newInstance()?
>>
>> That seems to work to and is much shorter; thanks :-)
>>
>> -Joe
>>
>>>
>>>> + * can be replaced by
>>>> + *
>>>> + * <pre>{@code
>>>> + * clazz.getConstructor(new
>>>> Class<?>[0]).newInstance((Object[])null);
>>>> + * }</pre>
>>
>
More information about the core-libs-dev
mailing list