Author: gnodet
Date: Tue Oct  3 09:50:34 2017
New Revision: 1810825

URL: http://svn.apache.org/viewvc?rev=1810825&view=rev
Log:
[FELIX-5706] Unable to access DTO fields using reflection

Modified:
    
felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Reflective.java
    
felix/trunk/gogo/runtime/src/test/java/org/apache/felix/gogo/runtime/ReflectiveTest.java

Modified: 
felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Reflective.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Reflective.java?rev=1810825&r1=1810824&r2=1810825&view=diff
==============================================================================
--- 
felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Reflective.java
 (original)
+++ 
felix/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Reflective.java
 Tue Oct  3 09:50:34 2017
@@ -20,6 +20,7 @@ package org.apache.felix.gogo.runtime;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Array;
+import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
@@ -148,6 +149,26 @@ public final class Reflective
         }
         else
         {
+            if (args.isEmpty())
+            {
+                Field[] fields;
+                if (target instanceof Class<?>)
+                {
+                    fields = ((Class<?>) target).getFields();
+                }
+                else
+                    {
+                    fields = target.getClass().getFields();
+                }
+                for (Field f : fields)
+                {
+                    String mname = f.getName().toLowerCase(Locale.ENGLISH);
+                    if (mname.equals(name))
+                    {
+                        return f.get(target);
+                    }
+                }
+            }
             ArrayList<String> list = new ArrayList<>();
             for (Class<?>[] types : possibleTypes)
             {

Modified: 
felix/trunk/gogo/runtime/src/test/java/org/apache/felix/gogo/runtime/ReflectiveTest.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/gogo/runtime/src/test/java/org/apache/felix/gogo/runtime/ReflectiveTest.java?rev=1810825&r1=1810824&r2=1810825&view=diff
==============================================================================
--- 
felix/trunk/gogo/runtime/src/test/java/org/apache/felix/gogo/runtime/ReflectiveTest.java
 (original)
+++ 
felix/trunk/gogo/runtime/src/test/java/org/apache/felix/gogo/runtime/ReflectiveTest.java
 Tue Oct  3 09:50:34 2017
@@ -33,6 +33,15 @@ import org.junit.Test;
 public class ReflectiveTest {
 
     @Test
+    public void testDtoAccess() throws Exception {
+        InputStream in = new ByteArrayInputStream(new byte[0]);
+        OutputStream out = new ByteArrayOutputStream();
+        CommandProcessorImpl processor = new CommandProcessorImpl(null);
+        Object result = Reflective.invoke(new CommandSessionImpl(processor, 
in, out, out), new TheDTO("foo"), "name", Collections.emptyList());
+        assertEquals("foo", result);
+    }
+
+    @Test
     public void testArrayInvocation() throws Exception {
         assertEquals(new Object[] { 1, "ab" }, invoke("test1", 
Arrays.<Object>asList(1, "ab")));
         assertEquals(new String[] { "1", "ab" }, invoke("test2", 
Arrays.<Object>asList(1, "ab")));
@@ -101,4 +110,11 @@ public class ReflectiveTest {
         }
     }
 
+    static class TheDTO {
+        public String name;
+
+        public TheDTO(String name) {
+            this.name = name;
+        }
+    }
 }


Reply via email to