ソースを参照

new: FluentMap #getBinding(name)
change: enable reflective private access for JDK 8

Ranides Atterwim 2 年 前
コミット
8043636ecf

+ 8 - 1
assira.core/src/main/java/net/ranides/assira/reflection/BeanModel.java

@@ -209,9 +209,16 @@ public interface BeanModel {
         /**
          * Returns declared type of property
          * @param key key
-         * @return type
+         * @return type or null
          */
         IClass<?> getType(String key);
 
+        /**
+         * Returns declared type of property
+         * @param key key
+         * @return binding or null
+         */
+        BeanPropertyBinding<Object> getBinding(String key);
+
     }
 }

+ 53 - 1
assira.core/src/main/java/net/ranides/assira/reflection/impl/bean/RBeanModel.java

@@ -353,7 +353,59 @@ public class RBeanModel implements BeanModel, Serializable {
                 return s.arguments().types().first().get();
             }
 
-            throw FBeanModel.newUnsupportedOperationException("No property with name " + key);
+            return null;
+        }
+
+        @Override
+        public BeanPropertyBinding<Object> getBinding(String key) {
+            if(properties.containsKey(key)) {
+                return properties.get(key).bind(that);
+            }
+            if(fluentGet.containsKey(key) || fluentSet.containsKey(key)) {
+                return new RFluentBinding(key);
+            }
+            return null;
+        }
+
+        @RequiredArgsConstructor
+        private class RFluentBinding implements BeanPropertyBinding<Object> {
+
+            private final String name;
+
+            @Override
+            public IClass<?> type() {
+                return RFluentMap.this.getType(name);
+            }
+
+            @Override
+            public Object get() {
+                return RFluentMap.this.get(name);
+            }
+
+            @Override
+            public void set(Object value) {
+                RFluentMap.this.put(name, value);
+            }
+
+            @Override
+            public Object object() {
+                return RFluentMap.this.that;
+            }
+
+            @Override
+            public String name() {
+                return name;
+            }
+
+            @Override
+            public boolean isReadable() {
+                return fluentGet.containsKey(name);
+            }
+
+            @Override
+            public boolean isWritable() {
+                return fluentSet.containsKey(name);
+            }
         }
     }
 

+ 1 - 1
assira.core/src/main/java/net/ranides/assira/system/RuntimeConfiguration.java

@@ -35,7 +35,7 @@ public class RuntimeConfiguration {
         getBoolean(FEATURE_STRICT_REFLECTIVE_RESOLVE, false);
 
     private static final boolean FEATURE_BEAN_MODEL_FOR_PRIVATE_VALUE =
-        getBoolean(FEATURE_BEAN_MODEL_FOR_PRIVATE, true);
+        getBoolean(FEATURE_BEAN_MODEL_FOR_PRIVATE, RuntimeUtils.getJavaVersion() <= 8);
 
     public static boolean FEATURE_CACHE_DAEMON() {
         return FEATURE_CACHE_DAEMON_VALUE;