فهرست منبع

fix: BeanModel - access to public methods of non-public classess

Mariusz Sieroń 6 سال پیش
والد
کامیت
36512309d4

+ 5 - 4
assira/src/main/java/net/ranides/assira/reflection/impl/bean/RBeanMethod.java

@@ -8,10 +8,7 @@
 package net.ranides.assira.reflection.impl.bean;
 
 import net.ranides.assira.functional.VarFunction;
-import net.ranides.assira.reflection.BeanMethod;
-import net.ranides.assira.reflection.IClass;
-import net.ranides.assira.reflection.IClasses;
-import net.ranides.assira.reflection.IMethod;
+import net.ranides.assira.reflection.*;
 
 /**
  *
@@ -23,6 +20,10 @@ public class RBeanMethod implements BeanMethod {
     
     RBeanMethod(IMethod method) {
         this.method = method;
+
+        if(!method.parent().attributes().has(IAttribute.PUBLIC)) {
+            method.accessible();
+        }
     }
 
     @Override

+ 9 - 0
assira/src/main/java/net/ranides/assira/reflection/impl/bean/RBeanPropertyInfo.java

@@ -93,6 +93,10 @@ public class RBeanPropertyInfo {
         if(vgetter != null) {
             type = vgetter.returns();
             vsetter = vsetters.stream().filter(m -> m.matches(type)).findFirst().orElse(null);
+
+            if(!vgetter.parent().attributes().has(IAttribute.PUBLIC)) {
+                vgetter.accessible();
+            }
         }
         if(vsetter == null) {
             if( vsetters.size() > 1) {
@@ -103,6 +107,11 @@ public class RBeanPropertyInfo {
                 type = vsetter.arguments().types().first().get();
             }
 		}
+        if(vsetter != null) {
+            if(!vsetter.parent().attributes().has(IAttribute.PUBLIC)) {
+                vsetter.accessible();
+            }
+        }
     }
     
     private void initItem() throws IllegalArgumentException {

+ 1 - 0
assira/src/test/java/net/ranides/assira/reflection/IClassLoaderTest.java

@@ -9,6 +9,7 @@ import java.util.function.Supplier;
 
 import static org.junit.Assert.*;
 
+@SuppressWarnings("unchecked")
 public class IClassLoaderTest {
 
     private static final String TYPE1_CLASS = "..\\assira.test\\target\\classes\\net\\ranides\\assira\\test\\Type1.class";

+ 12 - 0
assira/src/test/java/net/ranides/assira/reflection/impl/bean/RBeanModelTest.java

@@ -16,6 +16,7 @@ import net.ranides.assira.reflection.BeanModel;
 import net.ranides.assira.reflection.mockup.ForBeanModel;
 import static net.ranides.assira.junit.NewAssert.*;
 import net.ranides.assira.reflection.IClass;
+import net.ranides.assira.reflection.mockup.ForFluentBean;
 import net.ranides.assira.reflection.mockup.ForIClass;
 import org.junit.Test;
 
@@ -326,6 +327,17 @@ public class RBeanModelTest {
         });
     }
 
+    @Test
+    public void testScope() {
+        Object v = ForFluentBean.newHidden("hidden value");
+        BeanModel.FluentMap f = BeanModel.typefor(v).fluent(v);
+
+        assertEquals("hidden name", f.get("name"));
+        assertEquals("hidden value", f.get("value"));
+        assertEquals("hidden value", f.put("value", "other"));
+        assertEquals("other", f.get("value"));
+    }
+
     public static class Point<N extends Number> {
         private N x;
         private N y;

+ 28 - 1
assira/src/test/java/net/ranides/assira/reflection/mockup/ForFluentBean.java

@@ -1,4 +1,31 @@
 package net.ranides.assira.reflection.mockup;
 
-public class ForBeanScope {
+public class ForFluentBean {
+
+    public static Object newHidden(String v) {
+        return new Hidden(v);
+    }
+
+    private static class Hidden {
+
+        private String v;
+
+        public Hidden(String v) {
+            this.v = v;
+        }
+
+        public String name() {
+            return "hidden name";
+        }
+
+        public String getValue() {
+            return v;
+        }
+
+        public void setValue(String v) {
+            this.v = v;
+        }
+
+    }
+
 }