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

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


The following commit(s) were added to refs/heads/master by this push:
     new 54c1f9ee9d org.apache.juneau.common.reflect API improvements
54c1f9ee9d is described below

commit 54c1f9ee9d560d0acaa1b8c043d79e1375770fcf
Author: James Bognar <[email protected]>
AuthorDate: Fri Nov 21 19:14:54 2025 -0500

    org.apache.juneau.common.reflect API improvements
---
 .../juneau/assertions/FluentAnyAssertion.java      |   1 -
 .../juneau/assertions/FluentObjectAssertion.java   |   1 -
 .../juneau/junit/bct/BasicBeanConverter.java       |   1 -
 .../juneau/common/collections/ReversedList.java    |   4 +-
 .../juneau/common/reflect/AnnotationInfo.java      |   9 -
 .../juneau/common/reflect/AnnotationProvider.java  | 349 +++------------------
 .../juneau/common/reflect/ExecutableInfo.java      |   1 -
 .../juneau/common/utils/CollectionUtils.java       |  22 ++
 .../src/main/java/org/apache/juneau/BeanMeta.java  |  32 +-
 .../java/org/apache/juneau/BeanPropertyMeta.java   |  52 ++-
 .../apache/juneau/BeanProxyInvocationHandler.java  |   1 -
 .../src/main/java/org/apache/juneau/Context.java   |   8 +-
 .../juneau/InvalidDataConversionException.java     |   1 -
 .../annotation/TargetedAnnotationCBuilder.java     |   2 -
 .../annotation/TargetedAnnotationMBuilder.java     |   2 -
 .../annotation/TargetedAnnotationMFBuilder.java    |   2 -
 .../annotation/TargetedAnnotationMFCBuilder.java   |   2 -
 .../annotation/TargetedAnnotationTMBuilder.java    |   2 -
 .../annotation/TargetedAnnotationTMFBuilder.java   |   2 -
 .../annotation/TargetedAnnotationTMFCBuilder.java  |   2 -
 .../apache/juneau/html/HtmlBeanPropertyMeta.java   |   8 +-
 .../juneau/http/annotation/FormDataAnnotation.java |   2 +
 .../juneau/http/annotation/HeaderAnnotation.java   |   2 +
 .../juneau/http/annotation/PathAnnotation.java     |   2 +
 .../http/annotation/PathRemainderAnnotation.java   |   1 +
 .../juneau/http/annotation/QueryAnnotation.java    |   2 +
 .../juneau/httppart/bean/RequestBeanMeta.java      |   2 +-
 .../httppart/bean/RequestBeanPropertyMeta.java     |   9 +-
 .../juneau/httppart/bean/ResponseBeanMeta.java     |  12 +-
 .../org/apache/juneau/internal/ClassUtils2.java    |   2 -
 .../org/apache/juneau/svl/VarResolverSession.java  |   1 -
 .../rest/client/remote/RemoteOperationMeta.java    |  24 +-
 .../rest/client/remote/RemoteOperationReturn.java  |   3 +-
 .../juneau/http/remote/RrpcInterfaceMeta.java      |   2 +-
 .../java/org/apache/juneau/rest/RestContext.java   |  11 +-
 .../java/org/apache/juneau/rest/RestOpContext.java |   3 +-
 .../org/apache/juneau/rest/arg/AttributeArg.java   |   1 +
 .../org/apache/juneau/rest/arg/FormDataArg.java    |   2 +-
 .../org/apache/juneau/rest/arg/HasFormDataArg.java |   1 +
 .../org/apache/juneau/rest/arg/HasQueryArg.java    |   1 +
 .../java/org/apache/juneau/rest/arg/HeaderArg.java |   2 +-
 .../java/org/apache/juneau/rest/arg/PathArg.java   |   4 +-
 .../java/org/apache/juneau/rest/arg/QueryArg.java  |   2 +-
 .../juneau/rest/debug/BasicDebugEnablement.java    |   7 +-
 .../juneau/rest/matcher/ClientVersionMatcher.java  |   1 +
 .../apache/juneau/rest/servlet/RestServlet.java    |   3 +-
 .../rest/swagger/BasicSwaggerProviderSession.java  | 247 +++++++--------
 .../juneau/common/reflect/MethodInfo_Test.java     |   2 +-
 48 files changed, 295 insertions(+), 560 deletions(-)

diff --git 
a/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentAnyAssertion.java
 
b/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentAnyAssertion.java
index 9c4363b075..74f716885c 100644
--- 
a/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentAnyAssertion.java
+++ 
b/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentAnyAssertion.java
@@ -26,7 +26,6 @@ import java.util.function.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.cp.*;
-import org.apache.juneau.common.reflect.*;
 import org.apache.juneau.serializer.*;
 
 /**
diff --git 
a/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentObjectAssertion.java
 
b/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentObjectAssertion.java
index 8b4fe22c14..fe9088d3a6 100644
--- 
a/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentObjectAssertion.java
+++ 
b/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentObjectAssertion.java
@@ -29,7 +29,6 @@ import java.util.function.*;
 import org.apache.juneau.common.utils.*;
 import org.apache.juneau.cp.*;
 import org.apache.juneau.json.*;
-import org.apache.juneau.common.reflect.*;
 import org.apache.juneau.serializer.*;
 
 /**
diff --git 
a/juneau-core/juneau-bct/src/main/java/org/apache/juneau/junit/bct/BasicBeanConverter.java
 
b/juneau-core/juneau-bct/src/main/java/org/apache/juneau/junit/bct/BasicBeanConverter.java
index e0028c7cc8..2491df011d 100644
--- 
a/juneau-core/juneau-bct/src/main/java/org/apache/juneau/junit/bct/BasicBeanConverter.java
+++ 
b/juneau-core/juneau-bct/src/main/java/org/apache/juneau/junit/bct/BasicBeanConverter.java
@@ -31,7 +31,6 @@ import java.util.concurrent.*;
 import java.util.function.*;
 import java.util.stream.*;
 
-import org.apache.juneau.common.reflect.*;
 import org.apache.juneau.common.utils.*;
 
 /**
diff --git 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/collections/ReversedList.java
 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/collections/ReversedList.java
index ad9cd4def5..7299a3f544 100644
--- 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/collections/ReversedList.java
+++ 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/collections/ReversedList.java
@@ -119,7 +119,7 @@ public class ReversedList<E> extends AbstractList<E> 
implements RandomAccess {
         */
        @Override
        public Iterator<E> iterator() {
-               return new Iterator<E>() {
+               return new Iterator<>() {
                        private final ListIterator<E> it = 
list.listIterator(list.size());
 
                        @Override
@@ -167,7 +167,7 @@ public class ReversedList<E> extends AbstractList<E> 
implements RandomAccess {
                if (index < 0 || index > size())
                        throw new IndexOutOfBoundsException("Index: " + index + 
", Size: " + size());
 
-               return new ListIterator<E>() {
+               return new ListIterator<>() {
                        private final ListIterator<E> it = 
list.listIterator(list.size() - index);
 
                        @Override
diff --git 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/AnnotationInfo.java
 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/AnnotationInfo.java
index 063af2383e..e05c954126 100644
--- 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/AnnotationInfo.java
+++ 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/AnnotationInfo.java
@@ -22,20 +22,11 @@ import static 
org.apache.juneau.common.utils.CollectionUtils.*;
 import static org.apache.juneau.common.utils.ThrowableUtils.*;
 import static org.apache.juneau.common.utils.Utils.*;
 
-import java.lang.annotation.*;
-import java.lang.reflect.*;
-import java.util.*;
-import java.util.function.*;
-import java.util.stream.*;
-
-import org.apache.juneau.common.utils.*;
-
 import java.lang.annotation.*;
 import java.util.*;
 import java.util.function.*;
 
 import org.apache.juneau.common.annotation.*;
-import org.apache.juneau.common.utils.*;
 
 /**
  * Encapsulates information about an annotation instance and the element it's 
declared on.
diff --git 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/AnnotationProvider.java
 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/AnnotationProvider.java
index 540639f7da..60a8b311f4 100644
--- 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/AnnotationProvider.java
+++ 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/AnnotationProvider.java
@@ -26,7 +26,6 @@ import static org.apache.juneau.common.utils.Utils.*;
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 import java.util.*;
-import java.util.stream.*;
 
 import org.apache.juneau.common.collections.*;
 
@@ -477,32 +476,32 @@ public class AnnotationProvider {
        
//-----------------------------------------------------------------------------------------------------------------
 
        /**
-        * Streams annotations from a class using configurable traversal 
options.
+        * Finds annotations from a class using configurable traversal options.
         *
         * <p>
-        * This method provides a flexible, stream-based API for traversing 
annotations without creating intermediate lists.
+        * This method provides a flexible API for traversing annotations.
         * It uses {@link AnnotationTraversal} enums to configure what elements 
to search and in what order.
         *
         * <h5 class='section'>Examples:</h5>
         * <p class='bjava'>
         *      <jc>// Search class only</jc>
-        *      Stream&lt;AnnotationInfo&lt;MyAnnotation&gt;&gt; <jv>s1</jv> =
-        *              search(MyAnnotation.<jk>class</jk>, <jv>ci</jv>, SELF);
+        *      List&lt;AnnotationInfo&lt;MyAnnotation&gt;&gt; <jv>l1</jv> =
+        *              find(MyAnnotation.<jk>class</jk>, <jv>ci</jv>, SELF);
         *
         *      <jc>// Search class and parents</jc>
-        *      Stream&lt;AnnotationInfo&lt;MyAnnotation&gt;&gt; <jv>s2</jv> =
-        *              search(MyAnnotation.<jk>class</jk>, <jv>ci</jv>, SELF, 
PARENTS);
+        *      List&lt;AnnotationInfo&lt;MyAnnotation&gt;&gt; <jv>l2</jv> =
+        *              find(MyAnnotation.<jk>class</jk>, <jv>ci</jv>, SELF, 
PARENTS);
         *
         *      <jc>// Search class, parents, and package (parent-first order 
using rstream)</jc>
         *      Stream&lt;AnnotationInfo&lt;MyAnnotation&gt;&gt; <jv>s3</jv> =
-        *              rstream(search(MyAnnotation.<jk>class</jk>, 
<jv>ci</jv>, SELF, PARENTS, PACKAGE).toList());
+        *              rstream(find(MyAnnotation.<jk>class</jk>, <jv>ci</jv>, 
SELF, PARENTS, PACKAGE));
         * </p>
         *
         * @param <A> The annotation type.
         * @param type The annotation type to search for.
         * @param c The class to search.
         * @param traversals The traversal options (what to search and order).
-        * @return A stream of {@link AnnotationInfo} objects. Never 
<jk>null</jk>.
+        * @return A list of {@link AnnotationInfo} objects. Never 
<jk>null</jk>.
         */
        public <A extends Annotation> List<AnnotationInfo<A>> find(Class<A> 
type, ClassInfo c, AnnotationTraversal... traversals) {
                assertArgNotNull("type", type);
@@ -511,69 +510,32 @@ public class AnnotationProvider {
        }
 
        /**
-        * Streams all annotations from a class using configurable traversal 
options, without filtering by annotation type.
+        * Finds all annotations from a class using configurable traversal 
options, without filtering by annotation type.
         *
         * <p>
-        * This method provides a flexible, stream-based API for traversing all 
class annotations without creating intermediate lists.
+        * This method provides a flexible API for traversing all class 
annotations.
         * Unlike {@link #find(Class, ClassInfo, AnnotationTraversal...)}, this 
method does not filter by annotation type.
         *
         * <h5 class='section'>Examples:</h5>
         * <p class='bjava'>
         *      <jc>// Get all annotations from class only</jc>
-        *      Stream&lt;AnnotationInfo&lt;Annotation&gt;&gt; <jv>s1</jv> =
+        *      List&lt;AnnotationInfo&lt;Annotation&gt;&gt; <jv>l1</jv> =
         *              find(<jv>ci</jv>, SELF);
         *
         *      <jc>// Get all annotations from class and parents</jc>
-        *      Stream&lt;AnnotationInfo&lt;Annotation&gt;&gt; <jv>s2</jv> =
+        *      List&lt;AnnotationInfo&lt;Annotation&gt;&gt; <jv>l2</jv> =
         *              find(<jv>ci</jv>, SELF, PARENTS);
         * </p>
         *
         * @param c The class to search.
         * @param traversals The traversal options (what to search and order).
-        * @return A stream of {@link AnnotationInfo} objects. Never 
<jk>null</jk>.
+        * @return A list of {@link AnnotationInfo} objects. Never 
<jk>null</jk>.
         */
        public List<AnnotationInfo<? extends Annotation>> find(ClassInfo c, 
AnnotationTraversal... traversals) {
                assertArgNotNull("c", c);
                return cache.get(null, c, traversals);
        }
 
-       /**
-        * Streams annotations from a class using configurable traversal 
options in parent-first order.
-        *
-        * <p>
-        * This is equivalent to calling {@link #find(Class, ClassInfo, 
AnnotationTraversal...)}
-        * and reversing the result.
-        *
-        * @param <A> The annotation type.
-        * @param type The annotation type to search for.
-        * @param c The class to search.
-        * @param traversals The traversal options (what to search and order).
-        * @return A stream of {@link AnnotationInfo} objects in parent-first 
order. Never <jk>null</jk>.
-        */
-       @Deprecated
-       public <A extends Annotation> Stream<AnnotationInfo<A>> 
findTopDown(Class<A> type, ClassInfo c, AnnotationTraversal... traversals) {
-               assertArgNotNull("type", type);
-               assertArgNotNull("c", c);
-               return rstream(cache.get(type, c, traversals));
-       }
-
-       /**
-        * Streams all annotations from a class using configurable traversal 
options in parent-first order, without filtering by annotation type.
-        *
-        * <p>
-        * This is equivalent to calling {@link #find(ClassInfo, 
AnnotationTraversal...)}
-        * and reversing the result.
-        *
-        * @param c The class to search.
-        * @param traversals The traversal options (what to search and order).
-        * @return A stream of {@link AnnotationInfo} objects in parent-first 
order. Never <jk>null</jk>.
-        */
-       @Deprecated
-       public Stream<AnnotationInfo<? extends Annotation>> 
findTopDown(ClassInfo c, AnnotationTraversal... traversals) {
-               assertArgNotNull("c", c);
-               return rstream(cache.get(null, c, traversals));
-       }
-
        /**
         * Checks if a class has the specified annotation.
         *
@@ -616,111 +578,61 @@ public class AnnotationProvider {
        }
 
        /**
-        * Streams annotations from a method using configurable traversal 
options.
+        * Finds annotations from a method using configurable traversal options.
         *
         * <p>
-        * This method provides a flexible, stream-based API for traversing 
method annotations without creating intermediate lists.
+        * This method provides a flexible API for traversing method 
annotations.
         *
         * <h5 class='section'>Examples:</h5>
         * <p class='bjava'>
         *      <jc>// Search method and matching parent methods</jc>
-        *      Stream&lt;AnnotationInfo&lt;MyAnnotation&gt;&gt; <jv>s1</jv> =
-        *              findAnnotations(MyAnnotation.<jk>class</jk>, 
<jv>mi</jv>, SELF, MATCHING_METHODS);
+        *      List&lt;AnnotationInfo&lt;MyAnnotation&gt;&gt; <jv>l1</jv> =
+        *              find(MyAnnotation.<jk>class</jk>, <jv>mi</jv>, SELF, 
MATCHING_METHODS);
         *
-        *      <jc>// Search method, matching methods, and return type 
(parent-first using findAnnotationsParentFirst)</jc>
+        *      <jc>// Search method, matching methods, and return type 
(parent-first using rstream)</jc>
         *      Stream&lt;AnnotationInfo&lt;MyAnnotation&gt;&gt; <jv>s2</jv> =
-        *              findAnnotationsParentFirst(MyAnnotation.<jk>class</jk>, 
<jv>mi</jv>, SELF, MATCHING_METHODS, RETURN_TYPE);
+        *              rstream(find(MyAnnotation.<jk>class</jk>, <jv>mi</jv>, 
SELF, MATCHING_METHODS, RETURN_TYPE));
         * </p>
         *
         * @param <A> The annotation type.
         * @param type The annotation type to search for.
         * @param m The method to search.
         * @param traversals The traversal options.
-        * @return A stream of {@link AnnotationInfo} objects. Never 
<jk>null</jk>.
+        * @return A list of {@link AnnotationInfo} objects. Never 
<jk>null</jk>.
         */
-       @Deprecated
-       public <A extends Annotation> Stream<AnnotationInfo<A>> find(Class<A> 
type, MethodInfo m, AnnotationTraversal... traversals) {
-               assertArgNotNull("type", type);
-               assertArgNotNull("m", m);
-               return cache.get(type, m, traversals).stream();
-       }
-
-       public <A extends Annotation> List<AnnotationInfo<A>> find2(Class<A> 
type, MethodInfo m, AnnotationTraversal... traversals) {
+       public <A extends Annotation> List<AnnotationInfo<A>> find(Class<A> 
type, MethodInfo m, AnnotationTraversal... traversals) {
                assertArgNotNull("type", type);
                assertArgNotNull("m", m);
                return cache.get(type, m, traversals);
        }
 
        /**
-        * Streams all annotations from a method using configurable traversal 
options, without filtering by annotation type.
+        * Finds all annotations from a method using configurable traversal 
options, without filtering by annotation type.
         *
         * <p>
-        * This method provides a flexible, stream-based API for traversing all 
method annotations without creating intermediate lists.
+        * This method provides a flexible API for traversing all method 
annotations.
         * Unlike {@link #find(Class, MethodInfo, AnnotationTraversal...)}, 
this method does not filter by annotation type.
         *
         * <h5 class='section'>Examples:</h5>
         * <p class='bjava'>
         *      <jc>// Get all annotations from method and matching parent 
methods</jc>
-        *      Stream&lt;AnnotationInfo&lt;Annotation&gt;&gt; <jv>s1</jv> =
+        *      List&lt;AnnotationInfo&lt;Annotation&gt;&gt; <jv>l1</jv> =
         *              find(<jv>mi</jv>, SELF, MATCHING_METHODS);
         *
         *      <jc>// Get all annotations from method, matching methods, and 
return type</jc>
-        *      Stream&lt;AnnotationInfo&lt;Annotation&gt;&gt; <jv>s2</jv> =
+        *      List&lt;AnnotationInfo&lt;Annotation&gt;&gt; <jv>l2</jv> =
         *              find(<jv>mi</jv>, SELF, MATCHING_METHODS, RETURN_TYPE);
         * </p>
         *
         * @param m The method to search.
         * @param traversals The traversal options.
-        * @return A stream of {@link AnnotationInfo} objects. Never 
<jk>null</jk>.
+        * @return A list of {@link AnnotationInfo} objects. Never 
<jk>null</jk>.
         */
-       @Deprecated
-       public Stream<AnnotationInfo<? extends Annotation>> find(MethodInfo m, 
AnnotationTraversal... traversals) {
-               assertArgNotNull("m", m);
-               return cache.get(null, m, traversals).stream();
-       }
-
-       public List<AnnotationInfo<? extends Annotation>> find2(MethodInfo m, 
AnnotationTraversal... traversals) {
+       public List<AnnotationInfo<? extends Annotation>> find(MethodInfo m, 
AnnotationTraversal... traversals) {
                assertArgNotNull("m", m);
                return cache.get(null, m, traversals);
        }
 
-       /**
-        * Streams annotations from a method using configurable traversal 
options in parent-first order.
-        *
-        * <p>
-        * This is equivalent to calling {@link #find(Class, MethodInfo, 
AnnotationTraversal...)}
-        * and reversing the result.
-        *
-        * @param <A> The annotation type.
-        * @param type The annotation type to search for.
-        * @param m The method to search.
-        * @param traversals The traversal options.
-        * @return A stream of {@link AnnotationInfo} objects in parent-first 
order. Never <jk>null</jk>.
-        */
-       @Deprecated
-       public <A extends Annotation> Stream<AnnotationInfo<A>> 
findTopDown(Class<A> type, MethodInfo m, AnnotationTraversal... traversals) {
-               assertArgNotNull("type", type);
-               assertArgNotNull("m", m);
-               return rstream(cache.get(type, m, traversals));
-       }
-
-       /**
-        * Streams all annotations from a method using configurable traversal 
options in parent-first order, without filtering by annotation type.
-        *
-        * <p>
-        * This is equivalent to calling {@link #find(MethodInfo, 
AnnotationTraversal...)}
-        * and reversing the result.
-        *
-        * @param m The method to search.
-        * @param traversals The traversal options.
-        * @return A stream of {@link AnnotationInfo} objects in parent-first 
order. Never <jk>null</jk>.
-        */
-       @Deprecated
-       public Stream<AnnotationInfo<? extends Annotation>> 
findTopDown(MethodInfo m, AnnotationTraversal... traversals) {
-               assertArgNotNull("m", m);
-               return rstream(cache.get(null, m, traversals));
-       }
-
        /**
         * Checks if a method has the specified annotation.
         *
@@ -759,11 +671,11 @@ public class AnnotationProvider {
         * @return <jk>true</jk> if the annotation is found, <jk>false</jk> 
otherwise.
         */
        public <A extends Annotation> boolean has(Class<A> type, MethodInfo m, 
AnnotationTraversal... traversals) {
-               return ! find2(type, m, traversals).isEmpty();
+               return ! find(type, m, traversals).isEmpty();
        }
 
        /**
-        * Streams annotations from a parameter using configurable traversal 
options in child-to-parent order.
+        * Finds annotations from a parameter using configurable traversal 
options in child-to-parent order.
         *
         * <p>
         * This method provides a flexible, stream-based API for traversing 
parameter annotations without creating intermediate lists.
@@ -799,65 +711,16 @@ public class AnnotationProvider {
         * @param traversals
         *      The traversal options. If not specified, defaults to {@code 
SELF, MATCHING_PARAMETERS, PARAMETER_TYPE}.
         *      <br>Valid values: {@link AnnotationTraversal#SELF SELF}, {@link 
AnnotationTraversal#MATCHING_PARAMETERS MATCHING_PARAMETERS}, {@link 
AnnotationTraversal#PARAMETER_TYPE PARAMETER_TYPE}
-        * @return A stream of {@link AnnotationInfo} objects in 
child-to-parent order. Never <jk>null</jk>.
+        * @return A list of {@link AnnotationInfo} objects in child-to-parent 
order. Never <jk>null</jk>.
         */
-       @Deprecated
-       public <A extends Annotation> Stream<AnnotationInfo<A>> find(Class<A> 
type, ParameterInfo p, AnnotationTraversal... traversals) {
-               assertArgNotNull("type", type);
-               assertArgNotNull("p", p);
-               return cache.get(type, p, traversals).stream();
-       }
-
-       public <A extends Annotation> List<AnnotationInfo<A>> find2(Class<A> 
type, ParameterInfo p, AnnotationTraversal... traversals) {
+       public <A extends Annotation> List<AnnotationInfo<A>> find(Class<A> 
type, ParameterInfo p, AnnotationTraversal... traversals) {
                assertArgNotNull("type", type);
                assertArgNotNull("p", p);
                return cache.get(type, p, traversals);
        }
 
        /**
-        * Streams annotations from a parameter using configurable traversal 
options in parent-to-child order.
-        *
-        * <p>
-        * This is equivalent to calling {@link #find(Class, ParameterInfo, 
AnnotationTraversal...)} and reversing the result.
-        * Use this when you need parent annotations to take precedence over 
child annotations.
-        *
-        * <h5 class='section'>Supported Traversal Types:</h5>
-        * <ul>
-        *      <li>{@link AnnotationTraversal#SELF SELF} - Annotations 
declared directly on this parameter
-        *      <li>{@link AnnotationTraversal#MATCHING_PARAMETERS 
MATCHING_PARAMETERS} - Matching parameters in parent methods/constructors 
(parent-to-child)
-        *      <li>{@link AnnotationTraversal#PARAMETER_TYPE PARAMETER_TYPE} - 
The parameter's type hierarchy (includes class parents and package)
-        * </ul>
-        *
-        * <p>
-        * <b>Default:</b> If no traversals are specified, defaults to: {@code 
SELF, MATCHING_PARAMETERS, PARAMETER_TYPE}
-        *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bjava'>
-        *      <jc>// Search in parent-to-child order</jc>
-        *      Stream&lt;AnnotationInfo&lt;MyAnnotation&gt;&gt; <jv>s</jv> =
-        *              findTopDown(MyAnnotation.<jk>class</jk>, <jv>pi</jv>, 
SELF, MATCHING_PARAMETERS, PARAMETER_TYPE);
-        *
-        *      <jc>// Get first annotation (from parent)</jc>
-        *      Optional&lt;AnnotationInfo&lt;MyAnnotation&gt;&gt; 
<jv>first</jv> = <jv>s</jv>.findFirst();
-        * </p>
-        *
-        * @param <A> The annotation type.
-        * @param type The annotation type to search for.
-        * @param p The parameter to search.
-        * @param traversals
-        *      The traversal options. If not specified, defaults to {@code 
SELF, MATCHING_PARAMETERS, PARAMETER_TYPE}.
-        *      <br>Valid values: {@link AnnotationTraversal#SELF SELF}, {@link 
AnnotationTraversal#MATCHING_PARAMETERS MATCHING_PARAMETERS}, {@link 
AnnotationTraversal#PARAMETER_TYPE PARAMETER_TYPE}
-        * @return A stream of {@link AnnotationInfo} objects in 
parent-to-child order. Never <jk>null</jk>.
-        */
-       @Deprecated
-       public <A extends Annotation> Stream<AnnotationInfo<A>> 
findTopDown(Class<A> type, ParameterInfo p, AnnotationTraversal... traversals) {
-               assertArgNotNull("type", type);
-               assertArgNotNull("p", p);
-               return rstream(cache.get(type, p, traversals));
-       }
-
-       /**
-        * Streams all annotations from a parameter using configurable 
traversal options, without filtering by annotation type.
+        * Finds all annotations from a parameter using configurable traversal 
options, without filtering by annotation type.
         *
         * <p>
         * This method provides a flexible, stream-based API for traversing all 
parameter annotations without creating intermediate lists.
@@ -888,38 +751,13 @@ public class AnnotationProvider {
         * @param traversals
         *      The traversal options. If not specified, defaults to {@code 
SELF, MATCHING_PARAMETERS, PARAMETER_TYPE}.
         *      <br>Valid values: {@link AnnotationTraversal#SELF SELF}, {@link 
AnnotationTraversal#MATCHING_PARAMETERS MATCHING_PARAMETERS}, {@link 
AnnotationTraversal#PARAMETER_TYPE PARAMETER_TYPE}
-        * @return A stream of {@link AnnotationInfo} objects in 
child-to-parent order. Never <jk>null</jk>.
+        * @return A list of {@link AnnotationInfo} objects in child-to-parent 
order. Never <jk>null</jk>.
         */
-       @Deprecated
-       public Stream<AnnotationInfo<? extends Annotation>> find(ParameterInfo 
p, AnnotationTraversal... traversals) {
-               assertArgNotNull("p", p);
-               return cache.get(null, p, traversals).stream();
-       }
-
-       public List<AnnotationInfo<? extends Annotation>> find2(ParameterInfo 
p, AnnotationTraversal... traversals) {
+       public List<AnnotationInfo<? extends Annotation>> find(ParameterInfo p, 
AnnotationTraversal... traversals) {
                assertArgNotNull("p", p);
                return cache.get(null, p, traversals);
        }
 
-       /**
-        * Streams all annotations from a parameter using configurable 
traversal options in parent-first order, without filtering by annotation type.
-        *
-        * <p>
-        * This is equivalent to calling {@link #find(ParameterInfo, 
AnnotationTraversal...)}
-        * and reversing the result.
-        *
-        * @param p The parameter to search.
-        * @param traversals
-        *      The traversal options. If not specified, defaults to {@code 
SELF, MATCHING_PARAMETERS, PARAMETER_TYPE}.
-        *      <br>Valid values: {@link AnnotationTraversal#SELF SELF}, {@link 
AnnotationTraversal#MATCHING_PARAMETERS MATCHING_PARAMETERS}, {@link 
AnnotationTraversal#PARAMETER_TYPE PARAMETER_TYPE}
-        * @return A stream of {@link AnnotationInfo} objects in 
parent-to-child order. Never <jk>null</jk>.
-        */
-       @Deprecated
-       public Stream<AnnotationInfo<? extends Annotation>> 
findTopDown(ParameterInfo p, AnnotationTraversal... traversals) {
-               assertArgNotNull("p", p);
-               return rstream(cache.get(null, p, traversals));
-       }
-
        /**
         * Checks if a parameter has the specified annotation.
         *
@@ -957,11 +795,11 @@ public class AnnotationProvider {
         * @return <jk>true</jk> if the annotation is found, <jk>false</jk> 
otherwise.
         */
        public <A extends Annotation> boolean has(Class<A> type, ParameterInfo 
p, AnnotationTraversal... traversals) {
-               return ! find2(type, p, traversals).isEmpty();
+               return ! find(type, p, traversals).isEmpty();
        }
 
        /**
-        * Streams annotations from a field using configurable traversal 
options.
+        * Finds annotations from a field using configurable traversal options.
         *
         * <p>
         * This method provides a flexible, stream-based API for traversing 
field annotations without creating intermediate lists.
@@ -977,23 +815,16 @@ public class AnnotationProvider {
         * @param type The annotation type to search for.
         * @param f The field to search.
         * @param traversals The traversal options.
-        * @return A stream of {@link AnnotationInfo} objects. Never 
<jk>null</jk>.
+        * @return A list of {@link AnnotationInfo} objects. Never 
<jk>null</jk>.
         */
-       @Deprecated
-       public <A extends Annotation> Stream<AnnotationInfo<A>> find(Class<A> 
type, FieldInfo f, AnnotationTraversal... traversals) {
-               assertArgNotNull("type", type);
-               assertArgNotNull("f", f);
-               return cache.get(type, f, traversals).stream();
-       }
-
-       public <A extends Annotation> List<AnnotationInfo<A>> find2(Class<A> 
type, FieldInfo f, AnnotationTraversal... traversals) {
+       public <A extends Annotation> List<AnnotationInfo<A>> find(Class<A> 
type, FieldInfo f, AnnotationTraversal... traversals) {
                assertArgNotNull("type", type);
                assertArgNotNull("f", f);
                return cache.get(type, f, traversals);
        }
 
        /**
-        * Streams all annotations from a field using configurable traversal 
options, without filtering by annotation type.
+        * Finds all annotations from a field using configurable traversal 
options, without filtering by annotation type.
         *
         * <p>
         * This method provides a flexible, stream-based API for traversing all 
field annotations without creating intermediate lists.
@@ -1008,56 +839,13 @@ public class AnnotationProvider {
         *
         * @param f The field to search.
         * @param traversals The traversal options.
-        * @return A stream of {@link AnnotationInfo} objects. Never 
<jk>null</jk>.
+        * @return A list of {@link AnnotationInfo} objects. Never 
<jk>null</jk>.
         */
-       @Deprecated
-       public Stream<AnnotationInfo<? extends Annotation>> find(FieldInfo f, 
AnnotationTraversal... traversals) {
-               assertArgNotNull("f", f);
-               return cache.get(null, f, traversals).stream();
-       }
-
-       public List<AnnotationInfo<? extends Annotation>> find2(FieldInfo f, 
AnnotationTraversal... traversals) {
+       public List<AnnotationInfo<? extends Annotation>> find(FieldInfo f, 
AnnotationTraversal... traversals) {
                assertArgNotNull("f", f);
                return cache.get(null, f, traversals);
        }
 
-       /**
-        * Streams annotations from a field using configurable traversal 
options in parent-first order.
-        *
-        * <p>
-        * This is equivalent to calling {@link #find(Class, FieldInfo, 
AnnotationTraversal...)}
-        * and reversing the result.
-        *
-        * @param <A> The annotation type.
-        * @param type The annotation type to search for.
-        * @param f The field to search.
-        * @param traversals The traversal options.
-        * @return A stream of {@link AnnotationInfo} objects in parent-first 
order. Never <jk>null</jk>.
-        */
-       @Deprecated
-       public <A extends Annotation> Stream<AnnotationInfo<A>> 
findTopDown(Class<A> type, FieldInfo f, AnnotationTraversal... traversals) {
-               assertArgNotNull("type", type);
-               assertArgNotNull("f", f);
-               return rstream(cache.get(type, f, traversals));
-       }
-
-       /**
-        * Streams all annotations from a field using configurable traversal 
options in parent-first order, without filtering by annotation type.
-        *
-        * <p>
-        * This is equivalent to calling {@link #find(FieldInfo, 
AnnotationTraversal...)}
-        * and reversing the result.
-        *
-        * @param f The field to search.
-        * @param traversals The traversal options.
-        * @return A stream of {@link AnnotationInfo} objects in parent-first 
order. Never <jk>null</jk>.
-        */
-       @Deprecated
-       public Stream<AnnotationInfo<? extends Annotation>> 
findTopDown(FieldInfo f, AnnotationTraversal... traversals) {
-               assertArgNotNull("f", f);
-               return rstream(cache.get(null, f, traversals));
-       }
-
        /**
         * Checks if a field has the specified annotation.
         *
@@ -1090,11 +878,11 @@ public class AnnotationProvider {
         * @return <jk>true</jk> if the annotation is found, <jk>false</jk> 
otherwise.
         */
        public <A extends Annotation> boolean has(Class<A> type, FieldInfo f, 
AnnotationTraversal... traversals) {
-               return ! find2(type, f, traversals).isEmpty();
+               return ! find(type, f, traversals).isEmpty();
        }
 
        /**
-        * Streams annotations from a constructor using configurable traversal 
options.
+        * Finds annotations from a constructor using configurable traversal 
options.
         *
         * <p>
         * This method provides a flexible, stream-based API for traversing 
constructor annotations without creating intermediate lists.
@@ -1110,7 +898,7 @@ public class AnnotationProvider {
         * @param type The annotation type to search for.
         * @param c The constructor to search.
         * @param traversals The traversal options.
-        * @return A stream of {@link AnnotationInfo} objects. Never 
<jk>null</jk>.
+        * @return A list of {@link AnnotationInfo} objects. Never 
<jk>null</jk>.
         */
        public <A extends Annotation> List<AnnotationInfo<A>> find(Class<A> 
type, ConstructorInfo c, AnnotationTraversal... traversals) {
                assertArgNotNull("type", type);
@@ -1119,7 +907,7 @@ public class AnnotationProvider {
        }
 
        /**
-        * Streams all annotations from a constructor using configurable 
traversal options, without filtering by annotation type.
+        * Finds all annotations from a constructor using configurable 
traversal options, without filtering by annotation type.
         *
         * <p>
         * This method provides a flexible, stream-based API for traversing all 
constructor annotations without creating intermediate lists.
@@ -1134,56 +922,13 @@ public class AnnotationProvider {
         *
         * @param c The constructor to search.
         * @param traversals The traversal options.
-        * @return A stream of {@link AnnotationInfo} objects. Never 
<jk>null</jk>.
+        * @return A list of {@link AnnotationInfo} objects. Never 
<jk>null</jk>.
         */
-       @Deprecated
-       public Stream<AnnotationInfo<? extends Annotation>> 
find(ConstructorInfo c, AnnotationTraversal... traversals) {
-               assertArgNotNull("c", c);
-               return cache.get(null, c, traversals).stream();
-       }
-
-       public List<AnnotationInfo<? extends Annotation>> find2(ConstructorInfo 
c, AnnotationTraversal... traversals) {
+       public List<AnnotationInfo<? extends Annotation>> find(ConstructorInfo 
c, AnnotationTraversal... traversals) {
                assertArgNotNull("c", c);
                return cache.get(null, c, traversals);
        }
 
-       /**
-        * Streams annotations from a constructor using configurable traversal 
options in parent-first order.
-        *
-        * <p>
-        * This is equivalent to calling {@link #find(Class, ConstructorInfo, 
AnnotationTraversal...)}
-        * and reversing the result.
-        *
-        * @param <A> The annotation type.
-        * @param type The annotation type to search for.
-        * @param c The constructor to search.
-        * @param traversals The traversal options.
-        * @return A stream of {@link AnnotationInfo} objects in parent-first 
order. Never <jk>null</jk>.
-        */
-       @Deprecated
-       public <A extends Annotation> Stream<AnnotationInfo<A>> 
findTopDown(Class<A> type, ConstructorInfo c, AnnotationTraversal... 
traversals) {
-               assertArgNotNull("type", type);
-               assertArgNotNull("c", c);
-               return rstream(cache.get(type, c, traversals));
-       }
-
-       /**
-        * Streams all annotations from a constructor using configurable 
traversal options in parent-first order, without filtering by annotation type.
-        *
-        * <p>
-        * This is equivalent to calling {@link #find(ConstructorInfo, 
AnnotationTraversal...)}
-        * and reversing the result.
-        *
-        * @param c The constructor to search.
-        * @param traversals The traversal options.
-        * @return A stream of {@link AnnotationInfo} objects in parent-first 
order. Never <jk>null</jk>.
-        */
-       @Deprecated
-       public Stream<AnnotationInfo<? extends Annotation>> 
findTopDown(ConstructorInfo c, AnnotationTraversal... traversals) {
-               assertArgNotNull("c", c);
-               return rstream(cache.get(null, c, traversals));
-       }
-
        /**
         * Checks if a constructor has the specified annotation.
         *
diff --git 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ExecutableInfo.java
 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ExecutableInfo.java
index 5062c31fd2..ae7285493c 100644
--- 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ExecutableInfo.java
+++ 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ExecutableInfo.java
@@ -18,7 +18,6 @@ package org.apache.juneau.common.reflect;
 
 import static org.apache.juneau.common.reflect.ClassArrayFormat.*;
 import static org.apache.juneau.common.reflect.ClassNameFormat.*;
-import static org.apache.juneau.common.reflect.ReflectionUtils.*;
 import static org.apache.juneau.common.utils.AssertionUtils.*;
 import static org.apache.juneau.common.utils.ClassUtils.*;
 import static org.apache.juneau.common.utils.CollectionUtils.*;
diff --git 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/utils/CollectionUtils.java
 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/utils/CollectionUtils.java
index 857b37a2e4..4e171cc919 100644
--- 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/utils/CollectionUtils.java
+++ 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/utils/CollectionUtils.java
@@ -1413,6 +1413,13 @@ public class CollectionUtils {
         * @param array The array to reverse.
         * @return The same array.
         */
+       /**
+        * Reverses the elements in the specified array in-place.
+        *
+        * @param <E> The element type.
+        * @param array The array to reverse.
+        * @return The same array, reversed.
+        */
        public static <E> E[] reverse(E[] array) {
                for (int i = 0; i < array.length / 2; i++) {
                        E temp = array[i];
@@ -1422,6 +1429,20 @@ public class CollectionUtils {
                return array;
        }
 
+       /**
+        * Returns a reversed view of the specified list.
+        *
+        * <p>
+        * The returned list is a live view that reflects changes to the 
original list.
+        *
+        * @param <E> The element type.
+        * @param list The list to reverse.
+        * @return A reversed view of the list.
+        */
+       public static <E> List<E> reverse(List<E> list) {
+               return new ReversedList<>(list);
+       }
+
        /**
         * Converts the specified collection to an array.
         *
@@ -1628,6 +1649,7 @@ public class CollectionUtils {
         * @param length The length of the array.
         * @return A new array of the specified type and length. Never 
<jk>null</jk>.
         */
+       @SuppressWarnings("unchecked")
        public static <E> E[] array(Class<E> componentType, int length) {
                return (E[])Array.newInstance(componentType, length);
        }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
index b5dc2adcac..d66edff5bc 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
@@ -187,9 +187,8 @@ public class BeanMeta<T> {
                private String findPropertyName(FieldInfo f) {
                        List<Beanp> lp = list();
                        List<Name> ln = list();
-                       // Inline Context.forEachAnnotation() calls
-                       ap.find(Beanp.class, f).map(x -> x.inner()).forEach(x 
-> lp.add(x));
-                       ap.find(Name.class, f).map(x -> x.inner()).forEach(x -> 
ln.add(x));
+                       ap.find(Beanp.class, f).forEach(x -> lp.add(x.inner()));
+                       ap.find(Name.class, f).forEach(x -> ln.add(x.inner()));
                        String name = bpName(lp, ln);
                        if (isNotEmpty(name))
                                return name;
@@ -593,25 +592,24 @@ public class BeanMeta<T> {
         * @param pn Use this property namer to determine property names from 
the method names.
         */
        static final List<BeanMethod> findBeanMethods(BeanContext ctx, Class<?> 
c, Class<?> stopClass, Visibility v, PropertyNamer pn, boolean fluentSetters) {
-               List<BeanMethod> l = new LinkedList<>();
+               var l = new LinkedList<BeanMethod>();
                var ap = ctx.getAnnotationProvider();
 
        forEachClass(info(c), stopClass, c2 -> {
                for (var m : c2.getDeclaredMethods()) {
                                if (m.isStatic() || m.isBridge() || 
m.getParameterCount() > 2 || m.getMatchingMethods().stream().anyMatch(m2 -> 
ap.has(BeanIgnore.class, m2, SELF, MATCHING_METHODS)))
                                        continue;
-                               Transient t = m.getMatchingMethods().stream()
-                                       .map(m2 -> ap.find(Transient.class, 
m2).map(x -> x.inner()).findFirst().orElse(null))
+
+                               var t = m.getMatchingMethods().stream()
+                                       .map(m2 -> ap.find(Transient.class, 
m2).stream().map(AnnotationInfo::inner).findFirst().orElse(null))
                                        .filter(Objects::nonNull)
                                        .findFirst()
                                        .orElse(null);
                                if (nn(t) && t.value())
                                        continue;
 
-                               List<Beanp> lp = list();
-                               List<Name> ln = list();
-                               ap.find(Beanp.class, m).map(x -> 
x.inner()).forEach(x -> lp.add(x));
-                               ap.find(Name.class, m).map(x -> 
x.inner()).forEach(x -> ln.add(x));
+                               var lp = ap.find(Beanp.class, 
m).stream().map(AnnotationInfo::inner).toList();
+                               var ln = ap.find(Name.class, 
m).stream().map(AnnotationInfo::inner).toList();
 
                                // If this method doesn't have @Beanp or @Name, 
check if it overrides a parent method that does
                                // This ensures property names are inherited 
correctly, preventing duplicate property definitions
@@ -620,12 +618,12 @@ public class BeanMeta<T> {
                                if (! (m.isVisible(v) || isNotEmpty(lp) || 
isNotEmpty(ln)))
                                        continue;
 
-                       String n = m.getSimpleName();
+                       var n = m.getSimpleName();
 
-                       List<ParameterInfo> params = m.getParameters();
-                       ClassInfo rt = m.getReturnType();
-                       MethodType methodType = UNKNOWN;
-                       String bpName = bpName(lp, ln);
+                       var params = m.getParameters();
+                       var rt = m.getReturnType();
+                       var methodType = UNKNOWN;
+                       var bpName = bpName(lp, ln);
 
                        if (params.isEmpty()) {
                                        if ("*".equals(bpName)) {
@@ -825,8 +823,8 @@ public class BeanMeta<T> {
 
                                        if (paramsMatch) {
                                                // Found a matching parent 
method - check for @Beanp and @Name annotations
-                                               ap.find(Beanp.class, 
parentMethod).map(x -> x.inner()).forEach(x -> lp.add(x));
-                                               ap.find(Name.class, 
parentMethod).map(x -> x.inner()).forEach(x -> ln.add(x));
+                                               ap.find(Beanp.class, 
parentMethod).forEach(x -> lp.add(x.inner()));
+                                               ap.find(Name.class, 
parentMethod).forEach(x -> ln.add(x.inner()));
 
                                                // If we found annotations, 
we're done
                                                if (! lp.isEmpty() || ! 
ln.isEmpty())
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
index 89c8d3d370..eafe5b0db8 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
@@ -65,7 +65,7 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
         */
        public static class Builder {
                BeanMeta<?> beanMeta;
-               BeanContext beanContext;
+               BeanContext bc;
                String name;
                Field field, innerField;  // TODO - Replace with FieldInfo 
fields
                Method getter, setter, extraKeys;  // TODO - Replace with 
MethodInfo fields
@@ -80,7 +80,7 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
 
                Builder(BeanMeta<?> beanMeta, String name) {
                        this.beanMeta = beanMeta;
-                       this.beanContext = beanMeta.ctx;
+                       this.bc = beanMeta.ctx;
                        this.name = name;
                }
 
@@ -227,8 +227,7 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
 
                        if (nn(innerField)) {
                                List<Beanp> lp = list();
-                               // Inline Context.forEachAnnotation() call
-                               ap.find(Beanp.class, ifi).map(x -> 
x.inner()).forEach(x -> lp.add(x));
+                               ap.find(Beanp.class, ifi).forEach(x -> 
lp.add(x.inner()));
                                if (nn(field) || isNotEmpty(lp)) {
                                        // Only use field type if it's a bean 
property or has @Beanp annotation.
                                        // Otherwise, we want to infer the type 
from the getter or setter.
@@ -246,14 +245,12 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                                        if (! x.wo().isEmpty())
                                                writeOnly = 
Boolean.valueOf(x.wo());
                                });
-                               // Inline Context.forEachAnnotation() call
-                               ap.find(Swap.class, ifi).map(x -> 
x.inner()).forEach(x -> swap = getPropertySwap(x));
+                               ap.find(Swap.class, 
ifi).stream().findFirst().ifPresent(x -> swap = getPropertySwap(x.inner()));
                                isUri |= ap.has(Uri.class, ifi);
                        }
 
                        if (nn(getter)) {
-                               List<Beanp> lp = list();
-                               ap.find(Beanp.class, gi).map(x -> 
x.inner()).forEach(x -> lp.add(x));
+                               var lp = ap.find(Beanp.class, 
gi).stream().map(AnnotationInfo::inner).toList();
                                if (rawTypeMeta == null)
                                        rawTypeMeta = 
bc.resolveClassMeta(last(lp), getter.getGenericReturnType(), typeVarImpls);
                                isUri |= (rawTypeMeta.isUri() || 
ap.has(Uri.class, gi));
@@ -268,12 +265,11 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                                        if (! x.wo().isEmpty())
                                                writeOnly = 
Boolean.valueOf(x.wo());
                                });
-                               ap.find(Swap.class, gi).map(x -> 
x.inner()).forEach(x -> swap = getPropertySwap(x));
+                               ap.find(Swap.class, 
gi).stream().map(AnnotationInfo::inner).forEach(x -> swap = getPropertySwap(x));
                        }
 
                        if (nn(setter)) {
-                               List<Beanp> lp = list();
-                               ap.find(Beanp.class, si).map(x -> 
x.inner()).forEach(x -> lp.add(x));
+                               var lp = ap.find(Beanp.class, 
si).stream().map(AnnotationInfo::inner).toList();
                                if (rawTypeMeta == null)
                                        rawTypeMeta = 
bc.resolveClassMeta(last(lp), setter.getGenericParameterTypes()[0], 
typeVarImpls);
                                isUri |= (rawTypeMeta.isUri() || 
ap.has(Uri.class, si));
@@ -288,13 +284,13 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                                        if (! x.wo().isEmpty())
                                                writeOnly = 
Boolean.valueOf(x.wo());
                                });
-                               ap.find(Swap.class, si).map(x -> 
x.inner()).forEach(x -> swap = getPropertySwap(x));
+                               ap.find(Swap.class, 
si).stream().map(AnnotationInfo::inner).forEach(x -> swap = getPropertySwap(x));
                        }
 
                        if (rawTypeMeta == null)
                                return false;
 
-                       this.beanRegistry = new BeanRegistry(beanContext, 
parentBeanRegistry, bdClasses.toArray(new Class<?>[0]));
+                       this.beanRegistry = new BeanRegistry(bc, 
parentBeanRegistry, bdClasses.toArray(new Class<?>[0]));
 
                        isDyna = "*".equals(name);
 
@@ -341,13 +337,13 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                        if (isDyna) {
                                rawTypeMeta = rawTypeMeta.getValueType();
                                if (rawTypeMeta == null)
-                                       rawTypeMeta = beanContext.object();
+                                       rawTypeMeta = bc.object();
                        }
                        if (rawTypeMeta == null)
                                return false;
 
                        if (typeMeta == null)
-                               typeMeta = (nn(swap) ? 
beanContext.getClassMeta(swap.getSwapClass().innerType()) : rawTypeMeta == null 
? beanContext.object() : rawTypeMeta);
+                               typeMeta = (nn(swap) ? 
bc.getClassMeta(swap.getSwapClass().innerType()) : rawTypeMeta == null ? 
bc.object() : rawTypeMeta);
                        if (typeMeta == null)
                                typeMeta = rawTypeMeta;
 
@@ -381,7 +377,8 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
        }
 
        final BeanMeta<?> beanMeta;                               // The bean 
that this property belongs to.
-       private final BeanContext beanContext;                    // The 
context that created this meta.
+       private final BeanContext bc;                    // The context that 
created this meta.
+       private final AnnotationProvider ap;
        private final String name;                                // The name 
of the property.
        private final Field field;                                // The bean 
property field (if it has one).
        private final Field innerField;                                // The 
bean property field (if it has one).
@@ -418,7 +415,8 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                this.extraKeys = b.extraKeys;
                this.isUri = b.isUri;
                this.beanMeta = b.beanMeta;
-               this.beanContext = b.beanContext;
+               this.bc = b.bc;
+               this.ap = bc.getAnnotationProvider();
                this.name = b.name;
                this.rawTypeMeta = b.rawTypeMeta;
                this.typeMeta = b.typeMeta;
@@ -642,11 +640,10 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
         * @return A list of annotations ordered in child-to-parent order.  
Never <jk>null</jk>.
         */
        public <A extends Annotation> BeanPropertyMeta 
forEachAnnotation(Class<A> a, Predicate<A> filter, Consumer<A> action) {
-               BeanContext bc = beanContext;
                if (nn(a)) {
-               if (nn(field)) bc.getAnnotationProvider().find(a, 
info(field)).map(x -> x.inner()).filter(filter).forEach(action);
-               if (nn(getter)) bc.getAnnotationProvider().find(a, 
info(getter), SELF, MATCHING_METHODS, RETURN_TYPE, PACKAGE).map(x -> 
x.inner()).filter(filter).forEach(action);
-               if (nn(setter)) bc.getAnnotationProvider().find(a, 
info(setter), SELF, MATCHING_METHODS, RETURN_TYPE, PACKAGE).map(x -> 
x.inner()).filter(filter).forEach(action);
+               if (nn(field)) ap.find(a, 
info(field)).stream().map(AnnotationInfo::inner).filter(filter).forEach(action);
+               if (nn(getter)) ap.find(a, info(getter), SELF, 
MATCHING_METHODS, RETURN_TYPE, 
PACKAGE).stream().map(AnnotationInfo::inner).filter(filter).forEach(action);
+               if (nn(setter)) ap.find(a, info(setter), SELF, 
MATCHING_METHODS, RETURN_TYPE, 
PACKAGE).stream().map(AnnotationInfo::inner).filter(filter).forEach(action);
        }
                return this;
        }
@@ -684,7 +681,6 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
        @SuppressWarnings("null")
        public <A extends Annotation> List<A> 
getAllAnnotationsParentFirst(Class<A> a) {
                List<A> l = new LinkedList<>();
-               BeanContext bc = beanContext;
                var ap = bc.getAnnotationProvider();
        var fi = field == null ? null : info(field);
        var gi = getter == null ? null : info(getter);
@@ -852,7 +848,7 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                        return invokeGetter(bean, pName);
 
                } catch (Throwable e) {
-                       if 
(beanContext.isIgnoreInvocationExceptionsOnGetters()) {
+                       if (bc.isIgnoreInvocationExceptionsOnGetters()) {
                                if (rawTypeMeta.isPrimitive())
                                        return 
rawTypeMeta.getPrimitiveDefault();
                                return null;
@@ -939,7 +935,7 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                if (cm.isObject()) {
                        if (o instanceof Map)
                                return new FilteredMap(cm, (Map)o, properties);
-                       BeanMeta bm = beanContext.getBeanMeta(o.getClass());
+                       BeanMeta bm = bc.getBeanMeta(o.getClass());
                        if (nn(bm))
                                return new BeanMap(session, o, new 
BeanMetaFiltered(cm.getBeanMeta(), properties));
                }
@@ -1011,7 +1007,7 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                        return toSerializedForm(m.getBeanSession(), getRaw(m, 
pName));
 
                } catch (Throwable e) {
-                       if 
(beanContext.isIgnoreInvocationExceptionsOnGetters()) {
+                       if (bc.isIgnoreInvocationExceptionsOnGetters()) {
                                if (rawTypeMeta.isPrimitive())
                                        return 
rawTypeMeta.getPrimitiveDefault();
                                return null;
@@ -1091,7 +1087,7 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                        boolean isCollection = rawTypeMeta.isCollection();
 
                        if ((! isDyna) && field == null && setter == null && ! 
(isMap || isCollection)) {
-                               if ((value == null && 
beanContext.isIgnoreUnknownNullBeanProperties()) || 
beanContext.isIgnoreMissingSetters())
+                               if ((value == null && 
bc.isIgnoreUnknownNullBeanProperties()) || bc.isIgnoreMissingSetters())
                                        return null;
                                throw bex(beanMeta.c, "Setter or public field 
not defined on property ''{0}''", name);
                        }
@@ -1100,7 +1096,7 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
 
                        try {
 
-                               Object r = 
(beanContext.isBeanMapPutReturnsOldValue() || isMap || isCollection) && 
(nn(getter) || nn(field)) ? get(m, pName) : null;
+                               Object r = (bc.isBeanMapPutReturnsOldValue() || 
isMap || isCollection) && (nn(getter) || nn(field)) ? get(m, pName) : null;
                                Class<?> propertyClass = 
rawTypeMeta.getInnerClass();
                                ClassInfo pcInfo = rawTypeMeta.getInfo();
 
@@ -1241,7 +1237,7 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                        } catch (BeanRuntimeException e) {
                                throw e;
                        } catch (Exception e) {
-                               if 
(beanContext.isIgnoreInvocationExceptionsOnSetters()) {
+                               if (bc.isIgnoreInvocationExceptionsOnSetters()) 
{
                                        if (rawTypeMeta.isPrimitive())
                                                return 
rawTypeMeta.getPrimitiveDefault();
                                        return null;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanProxyInvocationHandler.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanProxyInvocationHandler.java
index 7be205cf29..f37be3b3c2 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanProxyInvocationHandler.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanProxyInvocationHandler.java
@@ -24,7 +24,6 @@ import java.lang.reflect.*;
 import java.util.*;
 
 import org.apache.juneau.json.*;
-import org.apache.juneau.common.reflect.*;
 
 /**
  * Provides an {@link InvocationHandler} for creating beans from bean 
interfaces.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Context.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Context.java
index 4d949ca3ad..621a063867 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Context.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Context.java
@@ -673,13 +673,13 @@ public abstract class Context {
                        AnnotationProvider ap = AnnotationProvider.INSTANCE;
                        CollectionUtils.traverse(x, y -> {
                        if (x instanceof Class<?> x2)
-                               
work.add(ap.findTopDown(info(x2)).filter(CONTEXT_APPLY_FILTER));
+                               
work.add(rstream(ap.find(info(x2))).filter(CONTEXT_APPLY_FILTER));
                        else if (x instanceof ClassInfo x2)
-                                       
work.add(ap.findTopDown(x2).filter(CONTEXT_APPLY_FILTER));
+                                       
work.add(rstream(ap.find(x2)).filter(CONTEXT_APPLY_FILTER));
                        else if (x instanceof Method x2)
-                               
work.add(ap.findTopDown(info(x2)).filter(CONTEXT_APPLY_FILTER));
+                               
work.add(rstream(ap.find(info(x2))).filter(CONTEXT_APPLY_FILTER));
                        else if (x instanceof MethodInfo x2)
-                                       
work.add(ap.findTopDown(x2).filter(CONTEXT_APPLY_FILTER));
+                                       
work.add(rstream(ap.find(x2)).filter(CONTEXT_APPLY_FILTER));
                                else
                                        illegalArg("Invalid type passed to 
applyAnnotations:  {0}", cn(x));
                        });
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/InvalidDataConversionException.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/InvalidDataConversionException.java
index 03ef7d2fb5..d2dd162dee 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/InvalidDataConversionException.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/InvalidDataConversionException.java
@@ -22,7 +22,6 @@ import static org.apache.juneau.common.utils.Utils.*;
 import java.text.*;
 
 import org.apache.juneau.json.*;
-import org.apache.juneau.common.reflect.*;
 
 /**
  * General invalid conversion exception.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationCBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationCBuilder.java
index 518735c505..de10b27f35 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationCBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationCBuilder.java
@@ -21,8 +21,6 @@ import static 
org.apache.juneau.common.reflect.ReflectionUtils.*;
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 
-import org.apache.juneau.common.reflect.*;
-
 /**
  * An implementation of an annotation that has an <code>on</code> value 
targeting classes/methods/fields/constructors.
  *
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationMBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationMBuilder.java
index 2f74499ec6..45d3e02417 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationMBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationMBuilder.java
@@ -21,8 +21,6 @@ import static 
org.apache.juneau.common.reflect.ReflectionUtils.*;
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 
-import org.apache.juneau.common.reflect.*;
-
 /**
  * An implementation of an annotation that has an <code>on</code> value 
targeting classes/methods/fields/constructors.
  *
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationMFBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationMFBuilder.java
index 8e6d86998a..458d37bef4 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationMFBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationMFBuilder.java
@@ -21,8 +21,6 @@ import static 
org.apache.juneau.common.reflect.ReflectionUtils.*;
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 
-import org.apache.juneau.common.reflect.*;
-
 /**
  * An implementation of an annotation that has an <code>on</code> value 
targeting classes/methods/fields/constructors.
  *
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationMFCBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationMFCBuilder.java
index f2b773fafc..d73cc68ba4 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationMFCBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationMFCBuilder.java
@@ -21,8 +21,6 @@ import static 
org.apache.juneau.common.reflect.ReflectionUtils.*;
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 
-import org.apache.juneau.common.reflect.*;
-
 /**
  * An implementation of an annotation that has an <code>on</code> value 
targeting classes/methods/fields/constructors.
  *
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationTMBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationTMBuilder.java
index 89fc895fa5..2ff859a650 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationTMBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationTMBuilder.java
@@ -21,8 +21,6 @@ import static 
org.apache.juneau.common.reflect.ReflectionUtils.*;
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 
-import org.apache.juneau.common.reflect.*;
-
 /**
  * An implementation of an annotation that has an <code>on</code> value 
targeting classes/methods/fields/constructors.
  *
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationTMFBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationTMFBuilder.java
index a4cd36d75e..8cb91567db 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationTMFBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationTMFBuilder.java
@@ -21,8 +21,6 @@ import static 
org.apache.juneau.common.reflect.ReflectionUtils.*;
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 
-import org.apache.juneau.common.reflect.*;
-
 /**
  * An implementation of an annotation that has an <code>on</code> value 
targeting classes/methods/fields/constructors.
  *
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationTMFCBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationTMFCBuilder.java
index 90e7c9f8fa..1e03d74982 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationTMFCBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationTMFCBuilder.java
@@ -21,8 +21,6 @@ import static 
org.apache.juneau.common.reflect.ReflectionUtils.*;
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 
-import org.apache.juneau.common.reflect.*;
-
 /**
  * An implementation of an annotation that has an <code>on</code> value 
targeting classes/methods/fields/constructors.
  *
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlBeanPropertyMeta.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlBeanPropertyMeta.java
index ca2a3213bd..2c71bf6438 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlBeanPropertyMeta.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlBeanPropertyMeta.java
@@ -77,16 +77,16 @@ public class HtmlBeanPropertyMeta extends 
ExtendedBeanPropertyMeta {
         * @param bpm The metadata of the bean property of this additional 
metadata.
         * @param mp HTML metadata provider (for finding information about 
other artifacts).
         */
-       public HtmlBeanPropertyMeta(BeanPropertyMeta bpm, AnnotationProvider 
annotationProvider, HtmlMetaProvider mp) {
+       public HtmlBeanPropertyMeta(BeanPropertyMeta bpm, AnnotationProvider 
ap, HtmlMetaProvider mp) {
                super(bpm);
 
                Builder b = new Builder();
        if (nn(bpm.getInnerField()))
-               annotationProvider.find(Html.class, 
info(bpm.getInnerField())).map(x -> x.inner()).forEach(x -> b.findHtmlInfo(x));
+               ap.find(Html.class, info(bpm.getInnerField())).forEach(x -> 
b.findHtmlInfo(x.inner()));
        if (nn(bpm.getGetter()))
-               annotationProvider.find(Html.class, 
info(bpm.getGetter())).map(x -> x.inner()).forEach(x -> b.findHtmlInfo(x));
+               ap.find(Html.class, info(bpm.getGetter())).forEach(x -> 
b.findHtmlInfo(x.inner()));
        if (nn(bpm.getSetter()))
-               annotationProvider.find(Html.class, 
info(bpm.getSetter())).map(x -> x.inner()).forEach(x -> b.findHtmlInfo(x));
+               ap.find(Html.class, info(bpm.getSetter())).forEach(x -> 
b.findHtmlInfo(x.inner()));
 
                this.format = b.format;
                this.noTables = b.noTables;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/FormDataAnnotation.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/FormDataAnnotation.java
index 3b47907f17..4047a12a00 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/FormDataAnnotation.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/FormDataAnnotation.java
@@ -278,6 +278,7 @@ public class FormDataAnnotation {
         */
        public static Optional<String> findDef(ParameterInfo pi) {
                return AP.find(FormData.class, pi)
+                       .stream()
                        .map(AnnotationInfo::inner)
                        .filter(x -> isNotEmpty(x.def()))
                        .findFirst()
@@ -295,6 +296,7 @@ public class FormDataAnnotation {
         */
        public static Optional<String> findName(ParameterInfo pi) {
                return AP.find(FormData.class, pi)
+                       .stream()
                        .map(AnnotationInfo::inner)
                        .filter(x -> isAnyNotBlank(x.value(), x.name()))
                        .findFirst()
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/HeaderAnnotation.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/HeaderAnnotation.java
index 3a7af85219..dda5f4b8b3 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/HeaderAnnotation.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/HeaderAnnotation.java
@@ -278,6 +278,7 @@ public class HeaderAnnotation {
         */
        public static Optional<String> findDef(ParameterInfo pi) {
                return AP.find(Header.class, pi)
+                       .stream()
                        .map(AnnotationInfo::inner)
                        .filter(x -> isNotEmpty(x.def()))
                        .findFirst()
@@ -295,6 +296,7 @@ public class HeaderAnnotation {
         */
        public static Optional<String> findName(ParameterInfo pi) {
                return AP.find(Header.class, pi)
+                       .stream()
                        .map(AnnotationInfo::inner)
                        .filter(x -> isAnyNotBlank(x.value(), x.name()))
                        .findFirst()
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/PathAnnotation.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/PathAnnotation.java
index 9f1f9e59c6..f87e49c616 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/PathAnnotation.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/PathAnnotation.java
@@ -279,6 +279,7 @@ public class PathAnnotation {
         */
        public static Optional<String> findDef(ParameterInfo pi) {
                return AP.find(Header.class, pi)
+                       .stream()
                        .map(AnnotationInfo::inner)
                        .filter(x -> isNotEmpty(x.def()) && ne(NONE, x.def()))
                        .findFirst()
@@ -296,6 +297,7 @@ public class PathAnnotation {
         */
        public static Optional<String> findName(ParameterInfo pi) {
                return AP.find(Path.class, pi)
+                       .stream()
                        .map(AnnotationInfo::inner)
                        .filter(x -> isAnyNotBlank(x.value(), x.name()))
                        .findFirst()
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/PathRemainderAnnotation.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/PathRemainderAnnotation.java
index 1f1de34044..5a64f940a8 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/PathRemainderAnnotation.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/PathRemainderAnnotation.java
@@ -266,6 +266,7 @@ public class PathRemainderAnnotation {
         */
        public static Optional<String> findDef(ParameterInfo pi) {
                return AP.find(PathRemainder.class, pi)
+                       .stream()
                        .map(AnnotationInfo::inner)
                        .filter(x -> isNotEmpty(x.def()))
                        .findFirst()
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/QueryAnnotation.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/QueryAnnotation.java
index 58a31eda37..cce49b68d2 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/QueryAnnotation.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/QueryAnnotation.java
@@ -278,6 +278,7 @@ public class QueryAnnotation {
         */
        public static Optional<String> findDef(ParameterInfo pi) {
                return AP.find(Query.class, pi)
+                       .stream()
                        .map(AnnotationInfo::inner)
                        .filter(x -> isNotEmpty(x.def()))
                        .findFirst()
@@ -292,6 +293,7 @@ public class QueryAnnotation {
         */
        public static Optional<String> findName(ParameterInfo pi) {
                return AP.find(Query.class, pi)
+                       .stream()
                        .map(AnnotationInfo::inner)
                        .filter(x -> isAnyNotBlank(x.value(), x.name()))
                        .findFirst()
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanMeta.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanMeta.java
index 763af27661..28c781c028 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanMeta.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanMeta.java
@@ -84,7 +84,7 @@ public class RequestBeanMeta {
                }
 
                Builder apply(ParameterInfo mpi) {
-                       return 
apply(mpi.getParameterType().inner()).apply(AP.find(Request.class, 
mpi).findFirst().map(x -> x.inner()).orElse(null));
+                       return 
apply(mpi.getParameterType().inner()).apply(AP.find(Request.class, 
mpi).stream().findFirst().map(AnnotationInfo::inner).orElse(null));
                }
 
                Builder apply(Request a) {
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanPropertyMeta.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanPropertyMeta.java
index dd7958ee37..841e7d4438 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanPropertyMeta.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanPropertyMeta.java
@@ -16,6 +16,7 @@
  */
 package org.apache.juneau.httppart.bean;
 
+import static org.apache.juneau.common.utils.CollectionUtils.*;
 import static org.apache.juneau.common.utils.Utils.*;
 
 import java.lang.annotation.*;
@@ -63,10 +64,10 @@ public class RequestBeanPropertyMeta {
        }
 
        static RequestBeanPropertyMeta.Builder create(HttpPartType partType, 
Class<? extends Annotation> c, MethodInfo m) {
-               HttpPartSchema.Builder sb = 
HttpPartSchema.create().name(m.getPropertyName());
-               AnnotationProvider ap = AnnotationProvider.INSTANCE;
-               ap.findTopDown(Schema.class, 
m).map(AnnotationInfo::inner).forEach(x -> sb.apply(x));
-               ap.findTopDown(c, m).map(AnnotationInfo::inner).forEach(x -> 
sb.apply(x));
+               var sb = HttpPartSchema.create().name(m.getPropertyName());
+               var ap = AnnotationProvider.INSTANCE;
+               rstream(ap.find(Schema.class, m)).forEach(x -> 
sb.apply(x.inner()));
+               rstream(ap.find(c, m)).forEach(x -> sb.apply(x.inner()));
                return new 
Builder().partType(partType).schema(sb.build()).getter(m.inner());
        }
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/ResponseBeanMeta.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/ResponseBeanMeta.java
index ba1662c328..919b7e114f 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/ResponseBeanMeta.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/ResponseBeanMeta.java
@@ -129,8 +129,8 @@ public class ResponseBeanMeta {
                var b = new Builder(annotations);
                b.apply(m.getReturnType().unwrap(Value.class, 
Optional.class).innerType());
                AnnotationProvider ap = AnnotationProvider.INSTANCE;
-               ap.findTopDown(Response.class, 
m).map(AnnotationInfo::inner).forEach(x -> b.apply(x));
-               ap.findTopDown(StatusCode.class, 
m).map(AnnotationInfo::inner).forEach(x -> b.apply(x));
+               rstream(ap.find(Response.class, m)).forEach(x -> 
b.apply(x.inner()));
+               rstream(ap.find(StatusCode.class, m)).forEach(x -> 
b.apply(x.inner()));
                return b.build();
        }
 
@@ -146,8 +146,8 @@ public class ResponseBeanMeta {
                        return null;
                var b = new Builder(annotations);
                b.apply(mpi.getParameterType().unwrap(Value.class, 
Optional.class).innerType());
-               AP.findTopDown(Response.class, 
mpi).map(AnnotationInfo::inner).forEach(x -> b.apply(x));
-               AP.findTopDown(StatusCode.class, 
mpi).map(AnnotationInfo::inner).forEach(x -> b.apply(x));
+               rstream(AP.find(Response.class, mpi)).forEach(x -> 
b.apply(x.inner()));
+               rstream(AP.find(StatusCode.class, mpi)).forEach(x -> 
b.apply(x.inner()));
                return b.build();
        }
 
@@ -165,8 +165,8 @@ public class ResponseBeanMeta {
                var b = new Builder(annotations);
                b.apply(ci.innerType());
                var ai = AnnotationProvider.INSTANCE;
-               ai.findTopDown(Response.class, 
ci).map(AnnotationInfo::inner).forEach(x -> b.apply(x));
-               ai.findTopDown(StatusCode.class, 
ci).map(AnnotationInfo::inner).forEach(x -> b.apply(x));
+               rstream(ai.find(Response.class, ci)).forEach(x -> 
b.apply(x.inner()));
+               rstream(ai.find(StatusCode.class, ci)).forEach(x -> 
b.apply(x.inner()));
                return b.build();
        }
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ClassUtils2.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ClassUtils2.java
index 92f2ea2b14..b9c774ce46 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ClassUtils2.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ClassUtils2.java
@@ -19,8 +19,6 @@ package org.apache.juneau.internal;
 import static org.apache.juneau.common.reflect.ReflectionUtils.*;
 import static org.apache.juneau.common.utils.Utils.*;
 
-import org.apache.juneau.common.reflect.*;
-
 /**
  * Class-related utility methods.
  *
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolverSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolverSession.java
index f131ea1812..0832ba7811 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolverSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolverSession.java
@@ -30,7 +30,6 @@ import java.util.*;
 import org.apache.juneau.common.collections.*;
 import org.apache.juneau.common.utils.*;
 import org.apache.juneau.cp.*;
-import org.apache.juneau.common.reflect.*;
 
 /**
  * A var resolver session that combines a {@link VarResolver} with one or more 
session objects.
diff --git 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteOperationMeta.java
 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteOperationMeta.java
index 375bd133e4..631448e2a5 100644
--- 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteOperationMeta.java
+++ 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteOperationMeta.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.rest.client.remote;
 
 import static org.apache.juneau.Constants.*;
+import static org.apache.juneau.common.utils.CollectionUtils.*;
 import static org.apache.juneau.common.utils.StringUtils.*;
 import static org.apache.juneau.common.utils.Utils.*;
 import static org.apache.juneau.http.remote.RemoteUtils.*;
@@ -25,14 +26,12 @@ import static org.apache.juneau.httppart.HttpPartType.*;
 import java.lang.reflect.*;
 import java.util.*;
 import java.util.function.*;
-import java.util.stream.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.common.collections.*;
 import org.apache.juneau.common.utils.*;
 import org.apache.juneau.http.annotation.*;
 import org.apache.juneau.http.remote.*;
-import org.apache.juneau.httppart.*;
 import org.apache.juneau.httppart.bean.*;
 import org.apache.juneau.common.reflect.*;
 import org.apache.juneau.rest.common.utils.*;
@@ -58,15 +57,15 @@ public class RemoteOperationMeta {
                RemoteOperationReturn methodReturn;
                Map<String,String> pathDefaults = new LinkedHashMap<>(), 
queryDefaults = new LinkedHashMap<>(), headerDefaults = new LinkedHashMap<>(), 
formDataDefaults = new LinkedHashMap<>();
                String contentDefault = null;
+               static AnnotationProvider AP = AnnotationProvider.INSTANCE;
 
                Builder(String parentPath, Method m, String defaultMethod) {
 
                        var mi = MethodInfo.of(m);
-                       AnnotationProvider ap = AnnotationProvider.INSTANCE;
 
-                       List<AnnotationInfo<?>> al = 
ap.findTopDown(mi).filter(REMOTE_OP_GROUP).collect(Collectors.toList());
+                       var al = 
rstream(AP.find(mi)).filter(REMOTE_OP_GROUP).toList();
                        if (al.isEmpty())
-                               al = 
ap.findTopDown(mi.getReturnType().unwrap(Value.class, 
Optional.class)).filter(REMOTE_OP_GROUP).collect(Collectors.toList());
+                               al = 
rstream(AP.find(mi.getReturnType().unwrap(Value.class, 
Optional.class))).filter(REMOTE_OP_GROUP).toList();
 
                        var _httpMethod = Value.<String>empty();
                        var _path = Value.<String>empty();
@@ -80,7 +79,7 @@ public class RemoteOperationMeta {
                        al.stream().filter(x -> x.isType(RemoteOp.class) && 
isNotEmpty(((RemoteOp)x.inner()).value().trim())).forEach(x -> 
value.set(((RemoteOp)x.inner()).value().trim()));
 
                        if (value.isPresent()) {
-                               String v = value.get();
+                               var v = value.get();
                                int i = v.indexOf(' ');
                                if (i == -1) {
                                        httpMethod = v;
@@ -114,7 +113,7 @@ public class RemoteOperationMeta {
                        mi.getParameters().forEach(x -> {
                                var rma = RemoteOperationArg.create(x);
                                if (nn(rma)) {
-                                       HttpPartType pt = rma.getPartType();
+                                       var pt = rma.getPartType();
                                        if (pt == HEADER)
                                                headerArgs.add(rma);
                                        else if (pt == QUERY)
@@ -145,7 +144,8 @@ public class RemoteOperationMeta {
                // These handle both individual annotations and repeated 
annotation arrays
 
                private void processContentDefaults(MethodInfo mi) {
-                       AnnotationProvider.INSTANCE.find(Content.class, mi)
+                       AP.find(Content.class, mi)
+                               .stream()
                                .map(x -> x.inner().def())
                                .filter(x -> isNotBlank(x))
                                .findFirst()
@@ -153,28 +153,28 @@ public class RemoteOperationMeta {
                }
 
                private static void processFormDataDefaults(MethodInfo mi, 
Map<String,String> defaults) {
-                       AnnotationProvider.INSTANCE.findTopDown(FormData.class, 
mi)
+                       rstream(AP.find(FormData.class, mi))
                                .map(AnnotationInfo::inner)
                                .filter(x -> isAnyNotEmpty(x.name(), x.value()) 
&& isNotEmpty(x.def()))
                                .forEach(x -> 
defaults.put(firstNonEmpty(x.name(), x.value()), x.def()));
                }
 
                private static void processHeaderDefaults(MethodInfo mi, 
Map<String,String> defaults) {
-                       AnnotationProvider.INSTANCE.findTopDown(Header.class, 
mi)
+                       rstream(AP.find(Header.class, mi))
                                .map(AnnotationInfo::inner)
                                .filter(x -> isAnyNotEmpty(x.name(), x.value()) 
&& isNotEmpty(x.def()))
                                .forEach(x -> 
defaults.put(firstNonEmpty(x.name(), x.value()), x.def()));
                }
 
                private static void processPathDefaults(MethodInfo mi, 
Map<String,String> defaults) {
-                       AnnotationProvider.INSTANCE.findTopDown(Path.class, mi)
+                       rstream(AP.find(Path.class, mi))
                                .map(AnnotationInfo::inner)
                                .filter(x -> isAnyNotEmpty(x.name(), x.value()) 
&& ne(NONE, x.def()))
                                .forEach(x -> 
defaults.put(firstNonEmpty(x.name(), x.value()), x.def()));
                }
 
                private static void processQueryDefaults(MethodInfo mi, 
Map<String,String> defaults) {
-                       AnnotationProvider.INSTANCE.findTopDown(Query.class, mi)
+                       rstream(AP.find(Query.class, mi))
                                .map(AnnotationInfo::inner)
                                .filter(x -> isAnyNotEmpty(x.name(), x.value()) 
&& isNotEmpty(x.def()))
                                .forEach(x -> 
defaults.put(firstNonEmpty(x.name(), x.value()), x.def()));
diff --git 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteOperationReturn.java
 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteOperationReturn.java
index 44fdd707a3..70b7d4e66f 100644
--- 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteOperationReturn.java
+++ 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteOperationReturn.java
@@ -16,6 +16,7 @@
  */
 package org.apache.juneau.rest.client.remote;
 
+import static org.apache.juneau.common.utils.CollectionUtils.*;
 import static org.apache.juneau.http.remote.RemoteUtils.*;
 
 import java.lang.reflect.*;
@@ -46,7 +47,7 @@ public class RemoteOperationReturn {
                ClassInfo rt = m.getReturnType();
 
                var ap = AnnotationProvider.INSTANCE;
-               var al = ap.findTopDown(m).filter(REMOTE_OP_GROUP).toList();
+               var al = rstream(ap.find(m)).filter(REMOTE_OP_GROUP).toList();
 
                RemoteReturn rv = null;
 
diff --git 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RrpcInterfaceMeta.java
 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RrpcInterfaceMeta.java
index 57331a9ce1..30d5e9344b 100644
--- 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RrpcInterfaceMeta.java
+++ 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RrpcInterfaceMeta.java
@@ -58,7 +58,7 @@ public class RrpcInterfaceMeta {
                Value<String> path = Value.of("");
                var ci = ClassInfo.of(c);
 
-               AnnotationProvider.INSTANCE.findTopDown(Remote.class, ci).map(x 
-> x.inner().path()).filter(x -> isNotEmpty(x)).forEach(x -> 
path.set(trimSlashes(x)));
+               rstream(AnnotationProvider.INSTANCE.find(Remote.class, 
ci)).map(x -> x.inner().path()).filter(x -> isNotEmpty(x)).forEach(x -> 
path.set(trimSlashes(x)));
 
                Map<Method,RrpcInterfaceMethodMeta> methods = map();
                ci.getPublicMethods().stream().forEach(x -> 
methods.put(x.inner(), new RrpcInterfaceMethodMeta(uri, x.inner())));
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
index fc9e05b48d..104b9643c5 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
@@ -20,6 +20,7 @@ import static jakarta.servlet.http.HttpServletResponse.*;
 import static java.util.Collections.*;
 import static java.util.Optional.*;
 import static org.apache.juneau.collections.JsonMap.*;
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
 import static org.apache.juneau.common.utils.ClassUtils.*;
 import static org.apache.juneau.common.utils.CollectionUtils.*;
 import static org.apache.juneau.common.utils.CollectionUtils.addAll;
@@ -206,7 +207,7 @@ public class RestContext extends Context {
                        // @formatter:off
                        ClassInfo.ofProxy(r).getAllMethodsTopDown().stream()
                                .filter(y -> y.hasAnnotation(annotation))
-                               .forEach(y -> ap.findTopDown(annotation, 
y).map(AnnotationInfo::inner)
+                               .forEach(y -> rstream(ap.find(annotation, 
y)).map(AnnotationInfo::inner)
                                        .filter(z -> predicate == null || 
predicate.test(z))
                                        .forEach(z -> x.put(y.getSignature(), 
y.accessible().inner())));
                        // @formatter:on
@@ -1787,7 +1788,7 @@ public class RestContext extends Context {
                        });
 
                        var vrs = varResolver().build().createSession();
-                       var work = AnnotationWorkList.of(vrs, 
AnnotationProvider.INSTANCE.findTopDown(rci).filter(CONTEXT_APPLY_FILTER));
+                       var work = AnnotationWorkList.of(vrs, 
rstream(AnnotationProvider.INSTANCE.find(rci)).filter(CONTEXT_APPLY_FILTER));
 
                        apply(work);
                        beanContext().apply(work);
@@ -3852,7 +3853,7 @@ public class RestContext extends Context {
                        // @formatter:on
 
                        // Apply @Rest(beanStore).
-                       AnnotationProvider.INSTANCE.findTopDown(Rest.class, 
ClassInfo.of(resourceClass)).map(x -> x.inner().beanStore()).filter(x -> 
isNotVoid(x)).forEach(x -> v.get().type(x));
+                       rstream(AnnotationProvider.INSTANCE.find(Rest.class, 
info(resourceClass))).map(x -> x.inner().beanStore()).filter(x -> 
isNotVoid(x)).forEach(x -> v.get().type(x));
 
                        // Replace with bean from:  @RestInject public [static] 
BeanStore xxx(<args>)
                        // @formatter:off
@@ -3916,7 +3917,7 @@ public class RestContext extends Context {
                        // Find our config file.  It's the last non-empty 
@RestResource(config).
                        var vr = 
beanStore.getBean(VarResolver.class).orElseThrow(() -> new 
IllegalArgumentException("VarResolver not found."));
                        var cfv = Value.<String>empty();
-                       AnnotationProvider.INSTANCE.findTopDown(Rest.class, 
ClassInfo.of(resourceClass)).map(x -> x.inner().config()).filter(x -> 
isNotEmpty(x)).forEach(x -> cfv.set(vr.resolve(x)));
+                       rstream(AnnotationProvider.INSTANCE.find(Rest.class, 
info(resourceClass))).map(x -> x.inner().config()).filter(x -> 
isNotEmpty(x)).forEach(x -> cfv.set(vr.resolve(x)));
                        var cf = cfv.orElse("");
 
                        // If not specified or value is set to SYSTEM_DEFAULT, 
use system default config.
@@ -4583,7 +4584,7 @@ public class RestContext extends Context {
                        // @formatter:on
 
                        for (var mi : rci.getPublicMethods()) {
-                               List<AnnotationInfo<?>> al = 
ap.findTopDown(mi).filter(REST_OP_GROUP).collect(Collectors.toList());
+                               var al = 
rstream(ap.find(mi)).filter(REST_OP_GROUP).collect(Collectors.toList());
 
                                // Also include methods on @Rest-annotated 
interfaces.
                                if (al.isEmpty()) {
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContext.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContext.java
index 0a30ab07b5..4783348485 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContext.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContext.java
@@ -135,7 +135,7 @@ public class RestOpContext extends Context implements 
Comparable<RestOpContext>
                                var vr = context.getVarResolver();
                                var vrs = vr.createSession();
 
-                               var work = AnnotationWorkList.of(vrs, 
ap.findTopDown(mi, SELF, MATCHING_METHODS, DECLARING_CLASS, RETURN_TYPE, 
PACKAGE).filter(CONTEXT_APPLY_FILTER));
+                               var work = AnnotationWorkList.of(vrs, 
rstream(ap.find(mi, SELF, MATCHING_METHODS, DECLARING_CLASS, RETURN_TYPE, 
PACKAGE)).filter(CONTEXT_APPLY_FILTER));
 
                                apply(work);
 
@@ -1949,6 +1949,7 @@ public class RestOpContext extends Context implements 
Comparable<RestOpContext>
                                        httpMethod = "delete";
                                else if (mi.hasAnnotation(RestOp.class)) {
                                        httpMethod = 
AnnotationProvider.INSTANCE.find(RestOp.class, mi)
+                                               .stream()
                                                .map(x -> x.inner().method())
                                                .filter(x -> isNotEmpty(x))
                                                .findFirst()
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/AttributeArg.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/AttributeArg.java
index 108395d811..4036055d32 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/AttributeArg.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/AttributeArg.java
@@ -77,6 +77,7 @@ public class AttributeArg implements RestOpArg {
 
        private static String getName(ParameterInfo paramInfo) {
                return AP.find(Attr.class, paramInfo)
+                       .stream()
                        .map(AnnotationInfo::inner)
                        .filter(x -> isAnyNotBlank(x.value(), x.name()))
                        .findFirst()
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/FormDataArg.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/FormDataArg.java
index 44762188fa..326b03f5fd 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/FormDataArg.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/FormDataArg.java
@@ -105,7 +105,7 @@ public class FormDataArg implements RestOpArg {
                        return null;
 
                // Get parameter-level @FormData
-               var paramFormData = AP.find(FormData.class, 
pi).findFirst().map(x -> x.inner()).orElse(null);
+               var paramFormData = AP.find(FormData.class, 
pi).stream().findFirst().map(AnnotationInfo::inner).orElse(null);
 
                if (paramFormData == null) {
                        // No parameter-level @FormData, use class-level as-is
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/HasFormDataArg.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/HasFormDataArg.java
index 48584f9a9e..89eafb0ee2 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/HasFormDataArg.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/HasFormDataArg.java
@@ -79,6 +79,7 @@ public class HasFormDataArg implements RestOpArg {
         */
        protected HasFormDataArg(ParameterInfo pi) {
                this.name = AP.find(HasFormData.class, pi)
+                       .stream()
                        .map(AnnotationInfo::inner)
                        .filter(HasFormDataArg::hasName)
                        .findFirst()
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/HasQueryArg.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/HasQueryArg.java
index 2b650c4ba0..eb629fc0ec 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/HasQueryArg.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/HasQueryArg.java
@@ -80,6 +80,7 @@ public class HasQueryArg implements RestOpArg {
         */
        protected HasQueryArg(ParameterInfo pi) {
                this.name = AP.find(HasQuery.class, pi)
+                       .stream()
                        .map(AnnotationInfo::inner)
                        .filter(HasQueryArg::hasName)
                        .findFirst()
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/HeaderArg.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/HeaderArg.java
index 53f5e01407..33a9244d98 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/HeaderArg.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/HeaderArg.java
@@ -146,7 +146,7 @@ public class HeaderArg implements RestOpArg {
                        return null;
 
                // Get parameter-level @Header
-               var paramHeader = 
AnnotationProvider.INSTANCE.find(Header.class, pi).findFirst().map(x -> 
x.inner()).orElse(null);
+               var paramHeader = 
AnnotationProvider.INSTANCE.find(Header.class, 
pi).stream().findFirst().map(AnnotationInfo::inner).orElse(null);
 
                if (paramHeader == null) {
                        // No parameter-level @Header, use class-level as-is
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/PathArg.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/PathArg.java
index c002ee49a8..3e40ad5080 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/PathArg.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/PathArg.java
@@ -104,7 +104,7 @@ public class PathArg implements RestOpArg {
                        return null;
 
                // Get parameter-level @Path
-               var paramPath = AP.find(Path.class, pi).findFirst().map(x -> 
x.inner()).orElse(null);
+               var paramPath = AP.find(Path.class, 
pi).stream().findFirst().map(AnnotationInfo::inner).orElse(null);
 
                if (paramPath == null) {
                        // No parameter-level @Path, use class-level as-is
@@ -200,7 +200,7 @@ public class PathArg implements RestOpArg {
                        var mi = pi.getMethod();
 
                        for (int j = 0; j < i; j++) {
-                               var hasAnnotation = 
AnnotationProvider.INSTANCE.find(Path.class, 
mi.getParameter(j)).findAny().isPresent();
+                               var hasAnnotation = 
AnnotationProvider.INSTANCE.has(Path.class, mi.getParameter(j));
                                if (hasAnnotation)
                                        idx++;
                        }
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/QueryArg.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/QueryArg.java
index d00a01fb08..1baf07be45 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/QueryArg.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/QueryArg.java
@@ -105,7 +105,7 @@ public class QueryArg implements RestOpArg {
                        return null;
 
                // Get parameter-level @Query
-               var paramQuery = AP.find(Query.class, pi).findFirst().map(x -> 
x.inner()).orElse(null);
+               var paramQuery = AP.find(Query.class, 
pi).stream().findFirst().map(AnnotationInfo::inner).orElse(null);
 
                if (paramQuery == null) {
                        // No parameter-level @Query, use class-level as-is
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/debug/BasicDebugEnablement.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/debug/BasicDebugEnablement.java
index 9cae292cba..9cff499364 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/debug/BasicDebugEnablement.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/debug/BasicDebugEnablement.java
@@ -16,6 +16,7 @@
  */
 package org.apache.juneau.rest.debug;
 
+import static org.apache.juneau.common.utils.CollectionUtils.*;
 import static org.apache.juneau.common.utils.StringUtils.*;
 import static org.apache.juneau.common.utils.Utils.*;
 import static org.apache.juneau.rest.annotation.RestOpAnnotation.*;
@@ -74,7 +75,7 @@ public class BasicDebugEnablement extends DebugEnablement {
 
                // Gather @Rest(debug) settings.
                // @formatter:off
-               ap.findTopDown(Rest.class, 
ci).map(AnnotationInfo::inner).forEach(x -> {
+               rstream(ap.find(Rest.class, 
ci)).map(AnnotationInfo::inner).forEach(x -> {
                        String x2 = varResolver.resolve(x.debug());
                        if (! x2.isEmpty())
                                b.enable(Enablement.fromString(x2), 
ci.getNameFull());
@@ -85,7 +86,7 @@ public class BasicDebugEnablement extends DebugEnablement {
                // @formatter:off
                ci.getPublicMethods().stream()
                        .forEach(x ->
-                               ap.findTopDown(x)
+                               rstream(ap.find(x))
                                        .filter(REST_OP_GROUP)
                                        .flatMap(ai -> 
ai.getValue(String.class, "debug").stream())
                                        .filter(Utils::isNotEmpty)
@@ -98,7 +99,7 @@ public class BasicDebugEnablement extends DebugEnablement {
 
                // Gather @Rest(debugOn) settings.
                // @formatter:off
-               ap.findTopDown(Rest.class, 
ci).map(AnnotationInfo::inner).forEach(x -> {
+               rstream(ap.find(Rest.class, 
ci)).map(AnnotationInfo::inner).forEach(x -> {
                        String x2 = varResolver.resolve(x.debugOn());
                        for (var e : splitMap(x2, true).entrySet()) {
                                var k = e.getKey();
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/matcher/ClientVersionMatcher.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/matcher/ClientVersionMatcher.java
index 6d97fb5c2c..d682cd2e4c 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/matcher/ClientVersionMatcher.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/matcher/ClientVersionMatcher.java
@@ -47,6 +47,7 @@ public class ClientVersionMatcher extends RestMatcher {
        public ClientVersionMatcher(String clientVersionHeader, MethodInfo mi) {
                this.clientVersionHeader = isEmpty(clientVersionHeader) ? 
"Client-Version" : clientVersionHeader;
                var clientVersion = AnnotationProvider.INSTANCE.find(mi)
+                       .stream()
                        .filter(REST_OP_GROUP)
                        .flatMap(ai -> ai.getValue(String.class, 
"clientVersion").stream())
                        .filter(NOT_EMPTY)
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/servlet/RestServlet.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/servlet/RestServlet.java
index 67e3554330..fde317bf48 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/servlet/RestServlet.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/servlet/RestServlet.java
@@ -18,6 +18,7 @@ package org.apache.juneau.rest.servlet;
 
 import static jakarta.servlet.http.HttpServletResponse.*;
 import static java.util.logging.Level.*;
+import static org.apache.juneau.common.utils.CollectionUtils.*;
 import static org.apache.juneau.common.utils.StringUtils.*;
 import static org.apache.juneau.common.utils.ThrowableUtils.*;
 import static org.apache.juneau.common.utils.Utils.*;
@@ -111,7 +112,7 @@ public abstract class RestServlet extends HttpServlet {
                if (nn(context))
                        return context.getFullPath();
                var ci = ClassInfo.of(getClass());
-               return AnnotationProvider.INSTANCE.findTopDown(Rest.class, ci)
+               return rstream(AnnotationProvider.INSTANCE.find(Rest.class, ci))
                        .map(x -> x.inner().path())
                        .filter(x -> isNotEmpty(x))
                        .map(x -> trimSlashes(x))
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/swagger/BasicSwaggerProviderSession.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/swagger/BasicSwaggerProviderSession.java
index c5910ce539..4b37fe79bc 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/swagger/BasicSwaggerProviderSession.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/swagger/BasicSwaggerProviderSession.java
@@ -24,12 +24,9 @@ import static org.apache.juneau.common.utils.Utils.isEmpty;
 import static org.apache.juneau.rest.annotation.RestOpAnnotation.*;
 import static org.apache.juneau.rest.httppart.RestPartType.*;
 
-import java.io.*;
 import java.lang.reflect.*;
-import java.lang.reflect.Method;
 import java.util.*;
 import java.util.function.*;
-import java.util.stream.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
@@ -143,7 +140,7 @@ public class BasicSwaggerProviderSession {
        public Swagger getSwagger() throws Exception {
                // @formatter:off
 
-               InputStream is = ff.getStream(rci.getNameSimple() + ".json", 
locale).orElse(null);
+               var is = ff.getStream(rci.getNameSimple() + ".json", 
locale).orElse(null);
 
                var ap = this.context.getBeanContext().getAnnotationProvider();
 
@@ -152,16 +149,16 @@ public class BasicSwaggerProviderSession {
                Predicate<Map<?,?>> nem = Utils::isNotEmpty;
 
                // Load swagger JSON from classpath.
-               JsonMap omSwagger = Json5.DEFAULT.read(is, JsonMap.class);
+               var omSwagger = Json5.DEFAULT.read(is, JsonMap.class);
                if (omSwagger == null)
                        omSwagger = new JsonMap();
 
                // Combine it with @Rest(swagger)
-               List<Rest> restAnnotations = list();
-               ap.findTopDown(Rest.class, rci).map(x -> x.inner()).forEach(x 
-> restAnnotations.add(x));
+               var restAnnotations = rstream(ap.find(Rest.class, 
rci)).map(AnnotationInfo::inner).toList();
+
                for (var rr : restAnnotations) {
 
-                       JsonMap sInfo = omSwagger.getMap("info", true);
+                       var sInfo = omSwagger.getMap("info", true);
 
                        sInfo
                                .appendIf(ne, "title",
@@ -177,12 +174,12 @@ public class BasicSwaggerProviderSession {
                                        )
                                );
 
-                       org.apache.juneau.rest.annotation.Swagger r = 
rr.swagger();
+                       var r = rr.swagger();
 
                        omSwagger.append(parseMap(r.value(), "@Swagger(value) 
on class {0}", c));
 
                        if (! SwaggerAnnotation.empty(r)) {
-                               JsonMap info = omSwagger.getMap("info", true);
+                               var info = omSwagger.getMap("info", true);
 
                                info
                                        .appendIf(ne, "title", 
resolve(r.title()))
@@ -220,7 +217,7 @@ public class BasicSwaggerProviderSession {
 
                omSwagger.appendIf(nem, "externalDocs", 
parseMap(mb.findFirstString("externalDocs"), "Messages/externalDocs on class 
{0}", c));
 
-               JsonMap info = omSwagger.getMap("info", true);
+               var info = omSwagger.getMap("info", true);
 
                info
                        .appendIf(ne, "title", 
resolve(mb.findFirstString("title")))
@@ -233,9 +230,9 @@ public class BasicSwaggerProviderSession {
                if (info.isEmpty())
                        omSwagger.remove("info");
 
-               JsonList
-                       produces = omSwagger.getList("produces", true),
-                       consumes = omSwagger.getList("consumes", true);
+               var produces = omSwagger.getList("produces", true);
+               var consumes = omSwagger.getList("consumes", true);
+
                if (consumes.isEmpty())
                        consumes.addAll(context.getConsumes());
                if (produces.isEmpty())
@@ -251,10 +248,10 @@ public class BasicSwaggerProviderSession {
                        }
                }
 
-               String s = mb.findFirstString("tags");
+               var s = mb.findFirstString("tags");
                if (nn(s)) {
                        for (var m : parseListOrCdl(s, "Messages/tags on class 
{0}", c).elements(JsonMap.class)) {
-                               String name = m.getString("name");
+                               var name = m.getString("name");
                                if (name == null)
                                        throw new SwaggerException(null, "Tag 
definition found without name in resource bundle on class {0}", c);
                                if (tagMap.containsKey(name))
@@ -265,22 +262,22 @@ public class BasicSwaggerProviderSession {
                }
 
                // Load our existing bean definitions into our session.
-               JsonMap definitions = omSwagger.getMap("definitions", true);
+               var definitions = omSwagger.getMap("definitions", true);
                for (var defId : definitions.keySet())
                        js.addBeanDef(defId, new 
JsonMap(definitions.getMap(defId)));
 
                // Iterate through all the @RestOp methods.
                for (var sm : context.getRestOperations().getOpContexts()) {
 
-                       BeanSession bs = sm.getBeanContext().getSession();
+                       var bs = sm.getBeanContext().getSession();
 
-                       Method m = sm.getJavaMethod();
+                       var m = sm.getJavaMethod();
                        var mi = MethodInfo.of(m);
-                       List<AnnotationInfo<?>> al = 
ap.findTopDown(mi).filter(REST_OP_GROUP).collect(Collectors.toList());
-                       String mn = m.getName();
+                       var al = 
rstream(ap.find(mi)).filter(REST_OP_GROUP).toList();
+                       var mn = m.getName();
 
                        // Get the operation from the existing swagger so far.
-                       JsonMap op = getOperation(omSwagger, 
sm.getPathPattern(), sm.getHttpMethod().toLowerCase());
+                       var op = getOperation(omSwagger, sm.getPathPattern(), 
sm.getHttpMethod().toLowerCase());
 
                        // Add @RestOp(swagger)
                        Value<OpSwagger> _ms = Value.empty();
@@ -380,48 +377,48 @@ public class BasicSwaggerProviderSession {
                        // Finally, look for parameters defined on method.
                        for (var mpi : mi.getParameters()) {
 
-                               ClassInfo pt = mpi.getParameterType();
-                               Type type = pt.innerType();
+                               var pt = mpi.getParameterType();
+                               var type = pt.innerType();
 
                                if (ap.has(Content.class, mpi)) {
-                                       JsonMap param = paramMap.getMap(BODY + 
".body", true).append("in", BODY);
-                                       JsonMap schema = 
getSchema(param.getMap("schema"), type, bs);
-                                       ap.findTopDown(Schema.class, 
mpi).map(AnnotationInfo::inner).forEach(x -> merge(schema, x));
-                                       ap.findTopDown(Content.class, 
mpi).map(AnnotationInfo::inner).forEach(x -> merge(schema, x.schema()));
+                                       var param = paramMap.getMap(BODY + 
".body", true).append("in", BODY);
+                                       var schema = 
getSchema(param.getMap("schema"), type, bs);
+                                       rstream(ap.find(Schema.class, 
mpi)).forEach(x -> merge(schema, x.inner()));
+                                       rstream(ap.find(Content.class, 
mpi)).forEach(x -> merge(schema, x.inner().schema()));
                                        pushupSchemaFields(BODY, param, schema);
                                        param.appendIf(nem, "schema", schema);
                                        param.putIfAbsent("required", true);
                                        addBodyExamples(sm, param, false, type, 
locale);
 
                                } else if (ap.has(Query.class, mpi)) {
-                                       String name = 
QueryAnnotation.findName(mpi).orElse(null);
-                                       JsonMap param = paramMap.getMap(QUERY + 
"." + name, true).append("name", name).append("in", QUERY);
-                                       ap.findTopDown(Schema.class, 
mpi).map(AnnotationInfo::inner).forEach(x -> merge(param, x));
-                                       ap.findTopDown(Query.class, 
mpi).map(AnnotationInfo::inner).forEach(x -> merge(param, x.schema()));
+                                       var name = 
QueryAnnotation.findName(mpi).orElse(null);
+                                       var param = paramMap.getMap(QUERY + "." 
+ name, true).append("name", name).append("in", QUERY);
+                                       rstream(ap.find(Schema.class, 
mpi)).forEach(x -> merge(param, x.inner()));
+                                       rstream(ap.find(Query.class, 
mpi)).forEach(x -> merge(param, x.inner().schema()));
                                        pushupSchemaFields(QUERY, param, 
getSchema(param.getMap("schema"), type, bs));
                                        addParamExample(sm, param, QUERY, type);
 
                                } else if (ap.has(FormData.class, mpi)) {
-                                       String name = 
FormDataAnnotation.findName(mpi).orElse(null);
-                                       JsonMap param = 
paramMap.getMap(FORM_DATA + "." + name, true).append("name", name).append("in", 
FORM_DATA);
-                                       ap.findTopDown(Schema.class, 
mpi).map(AnnotationInfo::inner).forEach(x -> merge(param, x));
-                                       ap.findTopDown(FormData.class, 
mpi).map(AnnotationInfo::inner).forEach(x -> merge(param, x.schema()));
+                                       var name = 
FormDataAnnotation.findName(mpi).orElse(null);
+                                       var param = paramMap.getMap(FORM_DATA + 
"." + name, true).append("name", name).append("in", FORM_DATA);
+                                       rstream(ap.find(Schema.class, 
mpi)).forEach(x -> merge(param, x.inner()));
+                                       rstream(ap.find(FormData.class, 
mpi)).forEach(x -> merge(param, x.inner().schema()));
                                        pushupSchemaFields(FORM_DATA, param, 
getSchema(param.getMap("schema"), type, bs));
                                        addParamExample(sm, param, FORM_DATA, 
type);
 
                                } else if (ap.has(Header.class, mpi)) {
-                                       String name = 
HeaderAnnotation.findName(mpi).orElse(null);
-                                       JsonMap param = paramMap.getMap(HEADER 
+ "." + name, true).append("name", name).append("in", HEADER);
-                                       ap.findTopDown(Schema.class, 
mpi).map(AnnotationInfo::inner).forEach(x -> merge(param, x));
-                                       ap.findTopDown(Header.class, 
mpi).map(AnnotationInfo::inner).forEach(x -> merge(param, x.schema()));
+                                       var name = 
HeaderAnnotation.findName(mpi).orElse(null);
+                                       var param = paramMap.getMap(HEADER + 
"." + name, true).append("name", name).append("in", HEADER);
+                                       rstream(ap.find(Schema.class, 
mpi)).forEach(x -> merge(param, x.inner()));
+                                       rstream(ap.find(Header.class, 
mpi)).forEach(x -> merge(param, x.inner().schema()));
                                        pushupSchemaFields(HEADER, param, 
getSchema(param.getMap("schema"), type, bs));
                                        addParamExample(sm, param, HEADER, 
type);
 
                                } else if (ap.has(Path.class, mpi)) {
-                                       String name = 
PathAnnotation.findName(mpi).orElse(null);
-                                       JsonMap param = paramMap.getMap(PATH + 
"." + name, true).append("name", name).append("in", PATH);
-                                       ap.findTopDown(Schema.class, 
mpi).map(AnnotationInfo::inner).forEach(x -> merge(param, x));
-                                       ap.findTopDown(Path.class, 
mpi).map(AnnotationInfo::inner).forEach(x -> merge(param, x.schema()));
+                                       var name = 
PathAnnotation.findName(mpi).orElse(null);
+                                       var param = paramMap.getMap(PATH + "." 
+ name, true).append("name", name).append("in", PATH);
+                                       rstream(ap.find(Schema.class, 
mpi)).forEach(x -> merge(param, x.inner()));
+                                       rstream(ap.find(Path.class, 
mpi)).forEach(x -> merge(param, x.inner().schema()));
                                        pushupSchemaFields(PATH, param, 
getSchema(param.getMap("schema"), type, bs));
                                        addParamExample(sm, param, PATH, type);
                                        param.putIfAbsent("required", true);
@@ -431,37 +428,35 @@ public class BasicSwaggerProviderSession {
                        if (! paramMap.isEmpty())
                                op.put("parameters", paramMap.values());
 
-                       JsonMap responses = op.getMap("responses", true);
+                       var responses = op.getMap("responses", true);
 
                        for (var eci : mi.getExceptionTypes()) {
                                if (eci.hasAnnotation(Response.class)) {
-                                       List<Response> la = list();
-                                       ap.findTopDown(Response.class, 
eci).map(x -> x.inner()).forEach(x -> la.add(x));
-                                       List<StatusCode> la2 = list();
-                                       ap.findTopDown(StatusCode.class, 
eci).map(x -> x.inner()).forEach(x -> la2.add(x));
-                                       Set<Integer> codes = getCodes(la2, 500);
+                                       var la = 
rstream(ap.find(Response.class, eci)).map(AnnotationInfo::inner).toList();
+                                       var la2 = 
rstream(ap.find(StatusCode.class, eci)).map(x -> x.inner()).toList();
+                                       var codes = getCodes(la2, 500);
                                        for (var a : la) {
                                                for (var code : codes) {
-                                                       JsonMap om = 
responses.getMap(String.valueOf(code), true);
+                                                       var om = 
responses.getMap(String.valueOf(code), true);
                                                        merge(om, a);
-                                                       JsonMap schema = 
getSchema(om.getMap("schema"), m.getGenericReturnType(), bs);
-                                                       
ap.findTopDown(Schema.class, eci).map(AnnotationInfo::inner).forEach(x -> 
merge(schema, x));
+                                                       var schema = 
getSchema(om.getMap("schema"), m.getGenericReturnType(), bs);
+                                                       
rstream(ap.find(Schema.class, eci)).forEach(x -> merge(schema, x.inner()));
                                                        
pushupSchemaFields(RESPONSE, om, schema);
                                                        om.appendIf(nem, 
"schema", schema);
                                        }
                                }
-                               List<MethodInfo> methods = eci.getAllMethods();
+                               var methods = eci.getAllMethods();
                                for (int i = methods.size() - 1; i >= 0; i--) {
-                                       MethodInfo ecmi = methods.get(i);
-                                               Header a = 
ecmi.getAnnotations(Header.class).findFirst().map(AnnotationInfo::inner).orElse(null);
+                                       var ecmi = methods.get(i);
+                                       var a = 
ecmi.getAnnotations(Header.class).findFirst().map(AnnotationInfo::inner).orElse(null);
                                                if (a == null)
                                                        a = 
ecmi.getReturnType().unwrap(Value.class, 
Optional.class).getAnnotations(Header.class).findFirst().map(AnnotationInfo::inner).orElse(null);
                                                if (nn(a) && ! isMulti(a)) {
-                                                       String ha = a.name();
+                                                       var ha = a.name();
                                                        for (var code : codes) {
-                                                               JsonMap header 
= responses.getMap(String.valueOf(code), true).getMap("headers", 
true).getMap(ha, true);
-                                                               
ap.findTopDown(Schema.class, ecmi).map(x -> x.inner()).forEach(x -> 
merge(header, x));
-                                                               
ap.findTopDown(Schema.class, ecmi.getReturnType().unwrap(Value.class, 
Optional.class)).map(AnnotationInfo::inner).forEach(x -> merge(header, x));
+                                                               var header = 
responses.getMap(String.valueOf(code), true).getMap("headers", true).getMap(ha, 
true);
+                                                               
rstream(ap.find(Schema.class, ecmi)).forEach(x -> merge(header, x.inner()));
+                                                               
rstream(ap.find(Schema.class, ecmi.getReturnType().unwrap(Value.class, 
Optional.class))).forEach(x -> merge(header, x.inner()));
                                                                
pushupSchemaFields(RESPONSE_HEADER, header, getSchema(header.getMap("schema"), 
ecmi.getReturnType().unwrap(Value.class, Optional.class).innerType(), bs));
                                                        }
                                                }
@@ -470,19 +465,15 @@ public class BasicSwaggerProviderSession {
                        }
 
                        if (mi.hasAnnotation(Response.class) || 
mi.getReturnType().unwrap(Value.class, 
Optional.class).hasAnnotation(Response.class)) {
-                               List<Response> la = list();
-                               ap.findTopDown(Response.class, mi).map(x -> 
x.inner()).forEach(x -> la.add(x));
-                               
//context.getAnnotationProvider().xforEachMethodAnnotation(Response.class, mi, 
x -> true, x -> la.add(x));
-                               List<StatusCode> la2 = list();
-                               
//context.getAnnotationProvider().xforEachMethodAnnotation(StatusCode.class, 
mi, x -> true, x -> la2.add(x));
-                               ap.findTopDown(StatusCode.class, mi).map(x -> 
x.inner()).forEach(x -> la2.add(x));
-                               Set<Integer> codes = getCodes(la2, 200);
+                               var la = rstream(ap.find(Response.class, 
mi)).map(x -> x.inner()).toList();
+                               var la2 = rstream(ap.find(StatusCode.class, 
mi)).map(x -> x.inner()).toList();
+                               var codes = getCodes(la2, 200);
                                for (var a : la) {
                                        for (var code : codes) {
-                                               JsonMap om = 
responses.getMap(String.valueOf(code), true);
+                                               var om = 
responses.getMap(String.valueOf(code), true);
                                                merge(om, a);
-                                               JsonMap schema = 
getSchema(om.getMap("schema"), m.getGenericReturnType(), bs);
-                                               ap.findTopDown(Schema.class, 
mi).map(x -> x.inner()).forEach(x -> merge(schema, x));
+                                               var schema = 
getSchema(om.getMap("schema"), m.getGenericReturnType(), bs);
+                                               rstream(ap.find(Schema.class, 
mi)).forEach(x -> merge(schema, x.inner()));
                                                
//context.getAnnotationProvider().xforEachMethodAnnotation(Schema.class, mi, x 
-> true, x -> merge(schema, x));
                                                pushupSchemaFields(RESPONSE, 
om, schema);
                                                om.appendIf(nem, "schema", 
schema);
@@ -490,18 +481,17 @@ public class BasicSwaggerProviderSession {
                                        }
                        }
                        if (mi.getReturnType().hasAnnotation(Response.class)) {
-                               List<MethodInfo> methods = 
mi.getReturnType().getAllMethods();
+                               var methods = 
mi.getReturnType().getAllMethods();
                                for (int i = methods.size() - 1; i >= 0; i--) {
-                                       MethodInfo ecmi = methods.get(i);
+                                       var ecmi = methods.get(i);
                                                if 
(ecmi.hasAnnotation(Header.class)) {
-                                                       Header a = 
ecmi.getAnnotations(Header.class).findFirst().map(AnnotationInfo::inner).orElse(null);
-                                                       String ha = a.name();
+                                                       var a = 
ecmi.getAnnotations(Header.class).findFirst().map(AnnotationInfo::inner).orElse(null);
+                                                       var ha = a.name();
                                                        if (! isMulti(a)) {
                                                                for (var code : 
codes) {
-                                                                       JsonMap 
header = responses.getMap(String.valueOf(code), true).getMap("headers", 
true).getMap(ha, true);
-                                                                       
//context.getAnnotationProvider().xforEachMethodAnnotation(Schema.class, ecmi, 
x -> true, x -> merge(header, x));
-                                                                       
ap.findTopDown(Schema.class, ecmi).map(x -> x.inner()).forEach(x -> 
merge(header, x));
-                                                                       
ap.findTopDown(Schema.class, ecmi.getReturnType().unwrap(Value.class, 
Optional.class)).map(AnnotationInfo::inner).forEach(x -> merge(header, x));
+                                                                       var 
header = responses.getMap(String.valueOf(code), true).getMap("headers", 
true).getMap(ha, true);
+                                                                       
rstream(ap.find(Schema.class, ecmi)).forEach(x -> merge(header, x.inner()));
+                                                                       
rstream(ap.find(Schema.class, ecmi.getReturnType().unwrap(Value.class, 
Optional.class))).forEach(x -> merge(header, x.inner()));
                                                                        
merge(header, a.schema());
                                                                        
pushupSchemaFields(RESPONSE_HEADER, header, getSchema(header, 
ecmi.getReturnType().innerType(), bs));
                                                                }
@@ -510,10 +500,10 @@ public class BasicSwaggerProviderSession {
                                        }
                                }
                        } else if (m.getGenericReturnType() != void.class) {
-                               JsonMap om = responses.getMap("200", true);
+                               var om = responses.getMap("200", true);
                                var pt2 = 
ClassInfo.of(m.getGenericReturnType());
-                               JsonMap schema = getSchema(om.getMap("schema"), 
m.getGenericReturnType(), bs);
-                               ap.findTopDown(Schema.class, 
pt2).map(AnnotationInfo::inner).forEach(x -> merge(schema, x));
+                               var schema = getSchema(om.getMap("schema"), 
m.getGenericReturnType(), bs);
+                               rstream(ap.find(Schema.class, pt2)).forEach(x 
-> merge(schema, x.inner()));
                                pushupSchemaFields(RESPONSE, om, schema);
                                om.appendIf(nem, "schema", schema);
                                addBodyExamples(sm, om, true, 
m.getGenericReturnType(), locale);
@@ -522,21 +512,19 @@ public class BasicSwaggerProviderSession {
                        // Finally, look for Value @Header parameters defined 
on method.
                        for (var mpi : mi.getParameters()) {
 
-                               ClassInfo pt = mpi.getParameterType();
+                               var pt = mpi.getParameterType();
 
                                if (pt.is(Value.class) && (ap.has(Header.class, 
mpi))) {
-                                       List<Header> la = list();
-                                       ap.findTopDown(Header.class, 
mpi).map(AnnotationInfo::inner).forEach(x -> la.add(x));
-                                       List<StatusCode> la2 = list();
-                                       ap.findTopDown(StatusCode.class, 
mpi).map(AnnotationInfo::inner).forEach(x -> la2.add(x));
-                                       Set<Integer> codes = getCodes(la2, 200);
-                                       String name = 
HeaderAnnotation.findName(mpi).orElse(null);
-                                       Type type = 
Value.unwrap(mpi.getParameterType().innerType());
+                                       var la = rstream(ap.find(Header.class, 
mpi)).map(AnnotationInfo::inner).toList();
+                                       var la2 = 
rstream(ap.find(StatusCode.class, mpi)).map(AnnotationInfo::inner).toList();
+                                       var codes = getCodes(la2, 200);
+                                       var name = 
HeaderAnnotation.findName(mpi).orElse(null);
+                                       var type = 
Value.unwrap(mpi.getParameterType().innerType());
                                        for (var a : la) {
                                                if (! isMulti(a)) {
                                                        for (var code : codes) {
-                                                               JsonMap header 
= responses.getMap(String.valueOf(code), true).getMap("headers", 
true).getMap(name, true);
-                                                               
ap.findTopDown(Schema.class, mpi).map(AnnotationInfo::inner).forEach(x -> 
merge(header, x));
+                                                               var header = 
responses.getMap(String.valueOf(code), true).getMap("headers", 
true).getMap(name, true);
+                                                               
rstream(ap.find(Schema.class, mpi)).forEach(x -> merge(header, x.inner()));
                                                                merge(header, 
a.schema());
                                                                
pushupSchemaFields(RESPONSE_HEADER, header, getSchema(header, type, bs));
                                                        }
@@ -544,18 +532,16 @@ public class BasicSwaggerProviderSession {
                                        }
 
                                } else if (ap.has(Response.class, mpi)) {
-                                       List<Response> la = list();
-                                       ap.findTopDown(Response.class, 
mpi).map(AnnotationInfo::inner).forEach(x -> la.add(x));
-                                       List<StatusCode> la2 = list();
-                                       ap.findTopDown(StatusCode.class, 
mpi).map(AnnotationInfo::inner).forEach(x -> la2.add(x));
-                                       Set<Integer> codes = getCodes(la2, 200);
-                                       Type type = 
Value.unwrap(mpi.getParameterType().innerType());
+                                       var la = 
rstream(ap.find(Response.class, mpi)).map(AnnotationInfo::inner).toList();
+                                       var la2 = 
rstream(ap.find(StatusCode.class, mpi)).map(AnnotationInfo::inner).toList();
+                                       var codes = getCodes(la2, 200);
+                                       var type = 
Value.unwrap(mpi.getParameterType().innerType());
                                        for (var a : la) {
                                                for (var code : codes) {
-                                                       JsonMap om = 
responses.getMap(String.valueOf(code), true);
+                                                       var om = 
responses.getMap(String.valueOf(code), true);
                                                        merge(om, a);
-                                                       JsonMap schema = 
getSchema(om.getMap("schema"), type, bs);
-                                                       
ap.findTopDown(Schema.class, mpi).map(AnnotationInfo::inner).forEach(x -> 
merge(schema, x));
+                                                       var schema = 
getSchema(om.getMap("schema"), type, bs);
+                                                       
rstream(ap.find(Schema.class, mpi)).forEach(x -> merge(schema, x.inner()));
                                                        la.forEach(x -> 
merge(schema, x.schema()));
                                                        
pushupSchemaFields(RESPONSE, om, schema);
                                                        om.appendIf(nem, 
"schema", schema);
@@ -566,9 +552,9 @@ public class BasicSwaggerProviderSession {
 
                        // Add default response descriptions.
                        for (var e : responses.entrySet()) {
-                               String key = e.getKey();
-                               JsonMap val = responses.getMap(key);
-                               if (StringUtils.isDecimal(key))
+                               var key = e.getKey();
+                               var val = responses.getMap(key);
+                               if (isDecimal(key))
                                        val.appendIfAbsentIf(ne, "description", 
RestUtils.getHttpResponseText(Integer.parseInt(key)));
                        }
 
@@ -578,13 +564,13 @@ public class BasicSwaggerProviderSession {
                                op.put("responses", new TreeMap<>(responses));
 
                        if (! op.containsKey("consumes")) {
-                               List<MediaType> mConsumes = 
sm.getSupportedContentTypes();
+                               var mConsumes = sm.getSupportedContentTypes();
                                if (! mConsumes.equals(consumes))
                                        op.put("consumes", mConsumes);
                        }
 
                        if (! op.containsKey("produces")) {
-                               List<MediaType> mProduces = 
sm.getSupportedAcceptTypes();
+                               var mProduces = sm.getSupportedAcceptTypes();
                                if (! mProduces.equals(produces))
                                        op.put("produces", mProduces);
                        }
@@ -593,6 +579,7 @@ public class BasicSwaggerProviderSession {
                if (nn(js.getBeanDefs()))
                        for (var e : js.getBeanDefs().entrySet())
                                definitions.put(e.getKey(), 
fixSwaggerExtensions(e.getValue()));
+
                if (definitions.isEmpty())
                        omSwagger.remove("definitions");
 
@@ -605,7 +592,7 @@ public class BasicSwaggerProviderSession {
                        omSwagger.remove("produces");
 
                try {
-                       String swaggerJson = 
Json5Serializer.DEFAULT_READABLE.toString(omSwagger);
+                       var swaggerJson = 
Json5Serializer.DEFAULT_READABLE.toString(omSwagger);
                        return jp.parse(swaggerJson, Swagger.class);
                } catch (Exception e) {
                        throw new ServletException("Error detected in 
swagger.", e);
@@ -615,10 +602,10 @@ public class BasicSwaggerProviderSession {
 
        private void addBodyExamples(RestOpContext sm, JsonMap piri, boolean 
response, Type type, Locale locale) throws Exception {
 
-               String sex = piri.getString("example");
+               var sex = piri.getString("example");
 
                if (sex == null) {
-                       JsonMap schema = resolveRef(piri.getMap("schema"));
+                       var schema = resolveRef(piri.getMap("schema"));
                        if (nn(schema))
                                sex = schema.getString("example", 
schema.getString("example"));
                }
@@ -636,21 +623,21 @@ public class BasicSwaggerProviderSession {
                        }
                }
 
-               String examplesKey = "examples";  // Parameters don't have an 
examples attribute.
+               var examplesKey = "examples";  // Parameters don't have an 
examples attribute.
 
-               JsonMap examples = piri.getMap(examplesKey);
+               var examples = piri.getMap(examplesKey);
                if (examples == null)
                        examples = new JsonMap();
 
-               List<MediaType> mediaTypes = response ? 
sm.getSerializers().getSupportedMediaTypes() : 
sm.getParsers().getSupportedMediaTypes();
+               var mediaTypes = response ? 
sm.getSerializers().getSupportedMediaTypes() : 
sm.getParsers().getSupportedMediaTypes();
 
                for (var mt : mediaTypes) {
                        if (mt != MediaType.HTML) {
-                               Serializer s2 = 
sm.getSerializers().getSerializer(mt);
+                               var s2 = sm.getSerializers().getSerializer(mt);
                                if (nn(s2)) {
                                        try {
                                                // @formatter:off
-                                               String eVal = s2
+                                               var eVal = s2
                                                        .createSession()
                                                        .locale(locale)
                                                        .mediaType(mt)
@@ -672,16 +659,16 @@ public class BasicSwaggerProviderSession {
 
        private static void addParamExample(RestOpContext sm, JsonMap piri, 
RestPartType in, Type type) throws Exception {
 
-               String s = piri.getString("example");
+               var s = piri.getString("example");
 
                if (isEmpty(s))
                        return;
 
-               JsonMap examples = piri.getMap("examples");
+               var examples = piri.getMap("examples");
                if (examples == null)
                        examples = new JsonMap();
 
-               String paramName = piri.getString("name");
+               var paramName = piri.getString("name");
 
                if (in == QUERY)
                        s = "?" + urlEncodeLax(paramName) + "=" + 
urlEncodeLax(s);
@@ -741,7 +728,7 @@ public class BasicSwaggerProviderSession {
 
                schema = newMap(schema);
 
-               ClassMeta<?> cm = bs.getClassMeta(type);
+               var cm = bs.getClassMeta(type);
 
                if (schema.getBoolean("ignore", false))
                        return null;
@@ -749,7 +736,7 @@ public class BasicSwaggerProviderSession {
                if (schema.containsKey("type") || schema.containsKey("$ref"))
                        return schema;
 
-               JsonMap om = 
fixSwaggerExtensions(schema.append(js.getSchema(cm)));
+               var om = fixSwaggerExtensions(schema.append(js.getSchema(cm)));
 
                return om;
        }
@@ -761,8 +748,8 @@ public class BasicSwaggerProviderSession {
        }
 
        private static JsonList merge(JsonList...lists) {
-               JsonList l = lists[0];
-               for (int i = 1; i < lists.length; i++) {
+               var l = lists[0];
+               for (var i = 1; i < lists.length; i++) {
                        if (nn(lists[i])) {
                                if (l == null)
                                        l = new JsonList();
@@ -773,8 +760,8 @@ public class BasicSwaggerProviderSession {
        }
 
        private static JsonMap merge(JsonMap...maps) {
-               JsonMap m = maps[0];
-               for (int i = 1; i < maps.length; i++) {
+               var m = maps[0];
+               for (var i = 1; i < maps.length; i++) {
                        if (nn(maps[i])) {
                                if (m == null)
                                        m = new JsonMap();
@@ -802,7 +789,7 @@ public class BasicSwaggerProviderSession {
                        return om;
                om = newMap(om);
                for (var aa : a) {
-                       String name = StringUtils.firstNonEmpty(aa.name(), 
aa.value());
+                       var name = StringUtils.firstNonEmpty(aa.name(), 
aa.value());
                        if (isEmpty(name))
                                throw illegalArg("@Header used without name or 
value.");
                        merge(om.getMap(name, true), aa.schema());
@@ -947,7 +934,7 @@ public class BasicSwaggerProviderSession {
                try {
                        if (o == null)
                                return null;
-                       String s = (o instanceof String[] ? joinnl((String[])o) 
: o.toString());
+                       var s = (o instanceof String[] ? joinnl((String[])o) : 
o.toString());
                        if (s.isEmpty())
                                return null;
                        s = resolve(s);
@@ -963,7 +950,7 @@ public class BasicSwaggerProviderSession {
                try {
                        if (o == null)
                                return null;
-                       String s = (o instanceof String[] ? joinnl((String[])o) 
: o.toString());
+                       var s = (o instanceof String[] ? joinnl((String[])o) : 
o.toString());
                        if (s.isEmpty())
                                return null;
                        s = resolve(s);
@@ -979,7 +966,7 @@ public class BasicSwaggerProviderSession {
                if (o instanceof String[])
                        o = joinnl((String[])o);
                if (o instanceof String) {
-                       String s = o.toString();
+                       var s = o.toString();
                        if (s.isEmpty())
                                return null;
                        s = resolve(s);
@@ -1075,7 +1062,7 @@ public class BasicSwaggerProviderSession {
                        om2 = new JsonMap();
                }
                for (var e : om.entrySet()) {
-                       Object val = e.getValue();
+                       var val = e.getValue();
                        if (val instanceof JsonMap) {
                                val = resolve((JsonMap)val);
                        } else if (val instanceof JsonList) {
@@ -1106,7 +1093,7 @@ public class BasicSwaggerProviderSession {
                if (m == null)
                        return null;
                if (m.containsKey("$ref") && nn(js.getBeanDefs())) {
-                       String ref = m.getString("$ref");
+                       var ref = m.getString("$ref");
                        if (ref.startsWith("#/definitions/"))
                                return js.getBeanDefs().get(ref.substring(14));
                }
@@ -1116,7 +1103,7 @@ public class BasicSwaggerProviderSession {
        private JsonMap toJsonMap(String[] ss) throws ParseException {
                if (ss.length == 0)
                        return null;
-               String s = joinnl(ss);
+               var s = joinnl(ss);
                if (s.isEmpty())
                        return null;
                if (! isJsonObject(s, true))
@@ -1189,7 +1176,7 @@ public class BasicSwaggerProviderSession {
                        return null;
                Set<String> set = set();
                for (var s : ss)
-                       StringUtils.split(s, x -> set.add(x));
+                       split(s, x -> set.add(x));
                return set.isEmpty() ? null : set;
        }
 }
\ No newline at end of file
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/common/reflect/MethodInfo_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/common/reflect/MethodInfo_Test.java
index 687153f886..ed9e1c85fa 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/common/reflect/MethodInfo_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/common/reflect/MethodInfo_Test.java
@@ -350,7 +350,7 @@ class MethodInfo_Test extends TestBase {
        }
 
        private static List<A> annotations(MethodInfo mi, Class<? extends 
Annotation> a) {
-               return AnnotationProvider.INSTANCE.findTopDown(a, 
mi).map(AnnotationInfo::inner).map(x -> (A)x).collect(Collectors.toList());
+               return rstream(AnnotationProvider.INSTANCE.find(a, 
mi)).map(AnnotationInfo::inner).map(x -> (A)x).toList();
        }
 
        @Test void getAnnotationAny() {

Reply via email to