diff options
author | Cedric Beust <cedric@beust.com> | 2012-07-07 14:07:14 -0700 |
---|---|---|
committer | Cedric Beust <cedric@beust.com> | 2012-07-07 14:07:14 -0700 |
commit | f4ed64c254096dd10305a92c4d96656048f35b15 (patch) | |
tree | 7b4e935a106aec847c08ccfdb0b35d4a71a45ca8 | |
parent | 465c23886b71843fa1987f8b8802a46214d48e23 (diff) | |
download | jcommander-f4ed64c254096dd10305a92c4d96656048f35b15.tar.gz |
If we have a setter but no getter, try to find a field to calculate the default value.
-rw-r--r-- | src/main/java/com/beust/jcommander/Parameterized.java | 17 | ||||
-rw-r--r-- | src/test/java/com/beust/jcommander/MethodSetterTest.java | 17 |
2 files changed, 32 insertions, 2 deletions
diff --git a/src/main/java/com/beust/jcommander/Parameterized.java b/src/main/java/com/beust/jcommander/Parameterized.java index 14ce975..ff8753b 100644 --- a/src/main/java/com/beust/jcommander/Parameterized.java +++ b/src/main/java/com/beust/jcommander/Parameterized.java @@ -117,7 +117,22 @@ public class Parameterized { } catch (SecurityException e) { throw new ParameterException(e); } catch (NoSuchMethodException e) { - return null; + // Try to find a field + String name = m_method.getName(); + String fieldName = Character.toLowerCase(name.charAt(3)) + name.substring(4); + Object result = null; + try { + Field field = m_method.getDeclaringClass().getDeclaredField(fieldName); + if (field != null) { + field.setAccessible(true); + result = field.get(object); + } + } catch(NoSuchFieldException ex) { + // ignore + } catch(IllegalAccessException ex) { + // ignore + } + return result; } catch (IllegalArgumentException e) { throw new ParameterException(e); } catch (IllegalAccessException e) { diff --git a/src/test/java/com/beust/jcommander/MethodSetterTest.java b/src/test/java/com/beust/jcommander/MethodSetterTest.java index 8f6320b..f995ad6 100644 --- a/src/test/java/com/beust/jcommander/MethodSetterTest.java +++ b/src/test/java/com/beust/jcommander/MethodSetterTest.java @@ -78,8 +78,23 @@ public class MethodSetterTest { Assert.assertEquals(arg.port, new Integer(42)); } + public void noGetterButWithField() { + class Arg { + private Integer port = 43; + + @Parameter(names = "--port") + public void setPort(String port) { + this.port = Integer.parseInt(port); + } + } + Arg arg = new Arg(); + JCommander jc = new JCommander(arg, new String[] { "--port", "42" }); + ParameterDescription pd = jc.getParameters().get(0); + Assert.assertEquals(pd.getDefault(), 43); + } + @Test(enabled = false) public static void main(String[] args) throws Exception { - new MethodSetterTest().getterReturningNonString(); + new MethodSetterTest().noGetterButWithField(); } } |