You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2021/09/03 10:56:11 UTC

[isis] branch master updated: ISIS-2774: run field enumeration through ClassCache

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new 8151983  ISIS-2774: run field enumeration through ClassCache
8151983 is described below

commit 8151983e18edcdb1be8b423cf05e170877625fa6
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Sep 3 12:56:04 2021 +0200

    ISIS-2774: run field enumeration through ClassCache
---
 .../commons/internal/reflection/_ClassCache.java   | 23 ++++++++++++++++------
 .../isis/core/metamodel/facets/Evaluators.java     | 17 +++++++++-------
 2 files changed, 27 insertions(+), 13 deletions(-)

diff --git a/commons/src/main/java/org/apache/isis/commons/internal/reflection/_ClassCache.java b/commons/src/main/java/org/apache/isis/commons/internal/reflection/_ClassCache.java
index e587945..f6aa35d 100644
--- a/commons/src/main/java/org/apache/isis/commons/internal/reflection/_ClassCache.java
+++ b/commons/src/main/java/org/apache/isis/commons/internal/reflection/_ClassCache.java
@@ -18,6 +18,7 @@
  */
 package org.apache.isis.commons.internal.reflection;
 
+import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.util.HashMap;
 import java.util.Map;
@@ -93,6 +94,10 @@ public final class _ClassCache implements AutoCloseable {
         return inspectType(type).declaredMethods.stream();
     }
 
+    public Stream<Field> streamDeclaredFields(final Class<?> type) {
+        return inspectType(type).declaredFields.stream();
+    }
+
     /**
      * Returns a Stream of declared Methods, that pass the given {@code filter},
      * while as an optimization, memoizing the result under given
@@ -119,9 +124,10 @@ public final class _ClassCache implements AutoCloseable {
 
     @RequiredArgsConstructor
     private static class ClassModel {
+        private final Can<Field> declaredFields;
+        private final Can<Method> declaredMethods;
         private final Map<MethodKey, Method> publicMethodsByKey = new HashMap<>();
         private final Map<MethodKey, Method> nonPublicDeclaredMethodsByKey = new HashMap<>();
-        private final Can<Method> declaredMethods;
         private final Map<String, Can<Method>> declaredMethodsByAttribute = new HashMap<>();
     }
 
@@ -152,21 +158,24 @@ public final class _ClassCache implements AutoCloseable {
 
             return inspectedTypes.computeIfAbsent(type, __->{
 
+                val declaredFields = type.getDeclaredFields();
                 val declaredMethods = type.getDeclaredMethods();
 
-                val methods = new ClassModel(Can.ofArray(declaredMethods));
+                val model = new ClassModel(
+                        Can.ofArray(declaredFields),
+                        Can.ofArray(declaredMethods));
 
                 for(val method : declaredMethods) {
-                    methods.nonPublicDeclaredMethodsByKey.put(MethodKey.of(type, method), method);
+                    model.nonPublicDeclaredMethodsByKey.put(MethodKey.of(type, method), method);
                 }
 
                 for(val method : type.getMethods()) {
                     val key = MethodKey.of(type, method);
-                    methods.publicMethodsByKey.put(key, method);
-                    methods.nonPublicDeclaredMethodsByKey.remove(key);
+                    model.publicMethodsByKey.put(key, method);
+                    model.nonPublicDeclaredMethodsByKey.remove(key);
                 }
 
-                return methods;
+                return model;
 
             });
         }
@@ -193,4 +202,6 @@ public final class _ClassCache implements AutoCloseable {
     }
 
 
+
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/Evaluators.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/Evaluators.java
index e859a06..52b8ed6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/Evaluators.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/Evaluators.java
@@ -66,16 +66,17 @@ public final class Evaluators  {
             final Class<?> cls,
             final Class<T> annotationType) {
 
+        val classCache = _ClassCache.getInstance();
+
         return Stream.concat(
-                streamMethodEvaluators(cls, annotationType),
-                streamFieldEvaluators(cls, annotationType));
+                streamMethodEvaluators(cls, annotationType, classCache),
+                streamFieldEvaluators(cls, annotationType, classCache));
     }
 
     private static <T extends Annotation> Stream<Evaluator<T>> streamMethodEvaluators(
             final Class<?> cls,
-            final Class<T> annotationType) {
-
-        val classCache = _ClassCache.getInstance();
+            final Class<T> annotationType,
+            final _ClassCache classCache) {
 
         return classCache
         .streamDeclaredMethods(cls)
@@ -87,9 +88,11 @@ public final class Evaluators  {
 
     private static <T extends Annotation> Stream<Evaluator<T>> streamFieldEvaluators(
             final Class<?> cls,
-            final Class<T> annotationType) {
+            final Class<T> annotationType,
+            final _ClassCache classCache) {
 
-        return Stream.<Field>of(cls.getDeclaredFields())
+        return classCache
+        .streamDeclaredFields(cls)
         .map(field->FieldEvaluator.create(field, annotationType))
         .flatMap(Optional::stream);
     }