diff --git a/src/main/java/com/beust/jcommander/ParameterDescription.java b/src/main/java/com/beust/jcommander/ParameterDescription.java index 1882efa3..eef6627e 100644 --- a/src/main/java/com/beust/jcommander/ParameterDescription.java +++ b/src/main/java/com/beust/jcommander/ParameterDescription.java @@ -300,7 +300,10 @@ private Object handleSubParameters(String value, int currentIndex, Class type objectValue = type.newInstance(); parameterized.set(object, objectValue); } + boolean access = sai.field.isAccessible(); + sai.field.setAccessible(true); // before using the field, set accessible to true wrappedParameter.addValue(parameterized, objectValue, value, sai.field); + sai.field.setAccessible(access); // after using the field, set accessible to origin finalValue = objectValue; } catch (InstantiationException | IllegalAccessException e) { throw new ParameterException("Couldn't instantiate " + type, e); diff --git a/src/main/java/com/beust/jcommander/WrappedParameter.java b/src/main/java/com/beust/jcommander/WrappedParameter.java index e0cfc469..1c9313b2 100644 --- a/src/main/java/com/beust/jcommander/WrappedParameter.java +++ b/src/main/java/com/beust/jcommander/WrappedParameter.java @@ -81,6 +81,32 @@ public void addValue(Parameterized parameterized, Object object, Object value, F throws IllegalAccessException { if (parameter != null) { if (field != null) { + Class fieldClass = field.getType(); + if (fieldClass != value.getClass()) { + if (fieldClass == boolean.class || fieldClass == Boolean.class) + value = Boolean.parseBoolean(value.toString()); + else if (fieldClass == byte.class || fieldClass == Byte.class) + value = Byte.parseByte(value.toString()); + else if (fieldClass == short.class || fieldClass == Short.class) + value = Short.parseShort(value.toString()); + else if (fieldClass == int.class || fieldClass == Integer.class) + value = Integer.parseInt(value.toString()); + else if (fieldClass == long.class || fieldClass == Long.class) + value = Long.parseLong(value.toString()); + else if (fieldClass == char.class || fieldClass == Character.class) + value = value.toString().charAt(0); + else if (fieldClass == float.class || fieldClass == Float.class) + value = Float.parseFloat(value.toString()); + else if (fieldClass == double.class || fieldClass == Double.class) + value = Double.parseDouble(value.toString()); + else { + try { + value = fieldClass.getConstructor(value.getClass()).newInstance(value); + } catch (InstantiationException | InvocationTargetException | NoSuchMethodException e) { + e.printStackTrace(); + } + } + } field.set(object, value); } else { parameterized.set(object, value);