From 2c6747e65ab08d47a161b767977c0aab84e0ba25 Mon Sep 17 00:00:00 2001 From: Ross Goldberg <484615+rgoldberg@users.noreply.github.com> Date: Tue, 14 Dec 2021 04:07:40 -0500 Subject: [PATCH] DefaultFactory#create(Class): Reinstated use of `Class#newInstance()` instead of `Constructor#newInstance()`. Only use `Constructor#setAccessible(true)` if `IllegalAccessException` thrown. --- src/main/java/picocli/CommandLine.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/main/java/picocli/CommandLine.java b/src/main/java/picocli/CommandLine.java index 6031b3a10..8d606b7d0 100644 --- a/src/main/java/picocli/CommandLine.java +++ b/src/main/java/picocli/CommandLine.java @@ -5505,12 +5505,19 @@ public T create(Class cls) throws Exception { return cls.cast(new LinkedHashMap()); } } - Constructor constructor = cls.getDeclaredConstructor(); try { - return constructor.newInstance(); - } catch (IllegalAccessException ex) { - constructor.setAccessible(true); - return constructor.newInstance(); + @SuppressWarnings("deprecation") // Class.newInstance is deprecated in Java 9 + T result = cls.newInstance(); + return result; + } catch (Exception ex) { + // TODO log the error at debug level + Constructor constructor = cls.getDeclaredConstructor(); + try { + return constructor.newInstance(); + } catch (IllegalAccessException iaex) { + constructor.setAccessible(true); + return constructor.newInstance(); + } } } private static ITypeConverter[] createConverter(IFactory factory, Class>[] classes) {