Roman Vais 909b642
From 2b813829d02b89206493520eb86075a43b145db9 Mon Sep 17 00:00:00 2001
Roman Vais 909b642
From: Roman Vais <rvais@redhat.com>
Roman Vais 909b642
Date: Tue, 13 Jun 2017 13:24:24 +0200
Roman Vais 909b642
Subject: [PATCH] ParseValues-NullPointerException-patch
Roman Vais 909b642
Roman Vais 909b642
---
Roman Vais 909b642
 .../java/com/beust/jcommander/Parameterized.java   | 27 ++++++++++++++++++++--
Roman Vais 909b642
 1 file changed, 25 insertions(+), 2 deletions(-)
Roman Vais 909b642
Roman Vais 909b642
diff --git a/src/main/java/com/beust/jcommander/Parameterized.java b/src/main/java/com/beust/jcommander/Parameterized.java
Roman Vais 909b642
index 3264008..e937a66 100644
Roman Vais 909b642
--- a/src/main/java/com/beust/jcommander/Parameterized.java
Roman Vais 909b642
+++ b/src/main/java/com/beust/jcommander/Parameterized.java
Roman Vais 909b642
@@ -13,6 +13,8 @@ import java.lang.reflect.Type;
Roman Vais 909b642
 import java.util.Collections;
Roman Vais 909b642
 import java.util.List;
Roman Vais 909b642
 import java.util.Set;
Roman Vais 909b642
+import java.util.logging.Level;
Roman Vais 909b642
+import java.util.logging.Logger;
Roman Vais 909b642
 
Roman Vais 909b642
 /**
Roman Vais 909b642
  * Encapsulate a field or a method annotated with @Parameter or @DynamicParameter
Roman Vais 909b642
@@ -180,12 +182,33 @@ public class Parameterized {
Roman Vais 909b642
       String fieldName = Character.toLowerCase(name.charAt(3)) + name.substring(4);
Roman Vais 909b642
       Object result = null;
Roman Vais 909b642
       try {
Roman Vais 909b642
-        Field field = method.getDeclaringClass().getDeclaredField(fieldName);
Roman Vais 909b642
+        Field field = object.getClass().getDeclaredField(fieldName);
Roman Vais 909b642
         if (field != null) {
Roman Vais 909b642
           setFieldAccessible(field);
Roman Vais 909b642
           result = field.get(object);
Roman Vais 909b642
         }
Roman Vais 909b642
-      } catch(NoSuchFieldException | IllegalAccessException ex) {
Roman Vais 909b642
+      } catch(NoSuchFieldException ex) {
Roman Vais 909b642
+        Class clazz = object.getClass();
Roman Vais 909b642
+        Field found = null;
Roman Vais 909b642
+        while (clazz != null && method.getDeclaringClass().isAssignableFrom(clazz)) {
Roman Vais 909b642
+          try {
Roman Vais 909b642
+            found = clazz.getDeclaredField(fieldName);
Roman Vais 909b642
+          } catch (NoSuchFieldException nfex) {
Roman Vais 909b642
+            // ignore
Roman Vais 909b642
+          }
Roman Vais 909b642
+          if (found != null) break;
Roman Vais 909b642
+          clazz = clazz.getSuperclass();
Roman Vais 909b642
+        }
Roman Vais 909b642
+        if (found != null) {
Roman Vais 909b642
+          setFieldAccessible(found);
Roman Vais 909b642
+          try {
Roman Vais 909b642
+            result = found.get(object);
Roman Vais 909b642
+          } catch (IllegalAccessException iex) {
Roman Vais 909b642
+            // ignore
Roman Vais 909b642
+          }
Roman Vais 909b642
+        }
Roman Vais 909b642
+
Roman Vais 909b642
+      } catch(IllegalAccessException ex) {
Roman Vais 909b642
         // ignore
Roman Vais 909b642
       }
Roman Vais 909b642
       return result;
Roman Vais 909b642
-- 
Roman Vais 909b642
2.7.4
Roman Vais 909b642