>From the docs for Class.newInstance:

Note that this method propagates any exception thrown by the nullary
constructor, including a checked exception. Use of this method effectively
bypasses the compile-time exception checking that would otherwise be
performed by the compiler. The
Constructor.newInstance<http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Constructor.html#newInstance(java.lang.Object...)>
method
avoids this problem by wrapping any exception thrown by the constructor in
a (checked) 
InvocationTargetException<http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/InvocationTargetException.html>
.


On 16 April 2014 17:40, Remko Popma <[email protected]> wrote:

> Out of interest, what is the advantage of calling
> clazz.getConstructor().newInstance();
> vs
> clazz.newInstance(); ?
>
> Until now all the code I've seen simply uses newInstance unless the
> constructor needs parameters.
> And it is shorter. :-)
> So just wondering if I missed something...
>
>
>
> On Tue, Apr 15, 2014 at 4:03 PM, <[email protected]> wrote:
>
>> Author: mattsicker
>> Date: Tue Apr 15 07:03:55 2014
>> New Revision: 1587455
>>
>> URL: http://svn.apache.org/r1587455
>> Log:
>> Add fallback to Class.newInstance.
>>
>>   - In some scenarios, if a class doesn't have a constructor defined,
>> Class.getConstructor() will fail, but Class.newInstance() won't fail. Not
>> sure on the logic behind that one, Java.
>>
>> Modified:
>>
>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/helpers/Loader.java
>>
>> Modified:
>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/helpers/Loader.java
>> URL:
>> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/helpers/Loader.java?rev=1587455&r1=1587454&r2=1587455&view=diff
>>
>> ==============================================================================
>> ---
>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/helpers/Loader.java
>> (original)
>> +++
>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/helpers/Loader.java
>> Tue Apr 15 07:03:55 2014
>> @@ -21,6 +21,7 @@ import java.lang.ClassCastException;
>>  import java.lang.reflect.InvocationTargetException;
>>  import java.net.URL;
>>
>> +import org.apache.logging.log4j.Level;
>>  import org.apache.logging.log4j.Logger;
>>  import org.apache.logging.log4j.status.StatusLogger;
>>  import org.apache.logging.log4j.util.PropertiesUtil;
>> @@ -248,7 +249,7 @@ public final class Loader {
>>              // using the TCCL should work the same as the default
>> ClassLoader (i.e., init or not)
>>              return Class.forName(className, true, getTCL());
>>          } catch (final Throwable e) {
>> -            LOGGER.catching(e);
>> +            LOGGER.catching(Level.DEBUG, e);
>>              LOGGER.trace("TCCL didn't work. Trying Class.forName({}).",
>> className);
>>              return loadClassWithDefaultClassLoader(className);
>>          }
>> @@ -283,7 +284,7 @@ public final class Loader {
>>          try {
>>              return Class.forName(className, true,
>> ClassLoader.getSystemClassLoader());
>>          } catch (final Throwable t) {
>> -            LOGGER.catching(t);
>> +            LOGGER.catching(Level.DEBUG, t);
>>              LOGGER.trace("Couldn't use SystemClassLoader. Trying
>> Class.forName({}).", className);
>>              return Class.forName(className);
>>          }
>> @@ -306,7 +307,13 @@ public final class Loader {
>>                     InstantiationException,
>>                     NoSuchMethodException,
>>                     InvocationTargetException {
>> -        return loadClass(className).getConstructor().newInstance();
>> +        final Class<?> clazz = loadClass(className);
>> +        try {
>> +            return clazz.getConstructor().newInstance();
>> +        } catch (final NoSuchMethodException e) {
>> +            //noinspection ClassNewInstance
>> +            return clazz.newInstance();
>> +        }
>>      }
>>
>>      /**
>> @@ -342,7 +349,7 @@ public final class Loader {
>>          try {
>>              final Class<?> clazz = loadClass(className);
>>              return clazz != null;
>> -        } catch (final Exception ignored) {
>> +        } catch (final Throwable ignored) {
>>              return false;
>>          }
>>      }
>>
>>
>>
>


-- 
Matt Sicker <[email protected]>

Reply via email to