summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCedric Beust <cedric@beust.com>2012-07-07 14:07:14 -0700
committerCedric Beust <cedric@beust.com>2012-07-07 14:07:14 -0700
commitf4ed64c254096dd10305a92c4d96656048f35b15 (patch)
tree7b4e935a106aec847c08ccfdb0b35d4a71a45ca8
parent465c23886b71843fa1987f8b8802a46214d48e23 (diff)
downloadjcommander-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.java17
-rw-r--r--src/test/java/com/beust/jcommander/MethodSetterTest.java17
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();
}
}