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 3aed910189 org.apache.juneau.common.reflect API improvements
3aed910189 is described below

commit 3aed910189aa54c0ae00805caf0b483fac3a4e5c
Author: James Bognar <[email protected]>
AuthorDate: Fri Nov 21 18:04:06 2025 -0500

    org.apache.juneau.common.reflect API improvements
---
 .../juneau/assertions/FluentAnyAssertion.java      |  3 +-
 .../juneau/assertions/FluentObjectAssertion.java   |  3 +-
 .../juneau/junit/bct/BasicBeanConverter.java       |  5 +-
 .../juneau/common/reflect/AnnotationInfo.java      | 14 +++-
 .../juneau/common/reflect/AnnotationProvider.java  | 94 +++++++++++++++++-----
 .../juneau/common/reflect/ExecutableInfo.java      |  7 +-
 .../juneau/common/reflect/ReflectionUtils.java     |  4 +-
 .../org/apache/juneau/common/utils/ClassUtils.java | 19 ++---
 .../main/java/org/apache/juneau/BeanContext.java   | 13 +--
 .../src/main/java/org/apache/juneau/BeanMeta.java  | 47 +++++------
 .../java/org/apache/juneau/BeanPropertyMeta.java   | 52 ++++++------
 .../apache/juneau/BeanProxyInvocationHandler.java  |  7 +-
 .../main/java/org/apache/juneau/BeanRegistry.java  |  7 +-
 .../src/main/java/org/apache/juneau/ClassMeta.java | 83 ++++++++++---------
 .../src/main/java/org/apache/juneau/Context.java   | 25 +++---
 .../juneau/InvalidDataConversionException.java     |  5 +-
 .../annotation/TargetedAnnotationCBuilder.java     |  4 +-
 .../annotation/TargetedAnnotationMBuilder.java     |  4 +-
 .../annotation/TargetedAnnotationMFBuilder.java    |  6 +-
 .../annotation/TargetedAnnotationMFCBuilder.java   |  4 +-
 .../annotation/TargetedAnnotationTMBuilder.java    |  4 +-
 .../annotation/TargetedAnnotationTMFBuilder.java   |  6 +-
 .../annotation/TargetedAnnotationTMFCBuilder.java  |  4 +-
 .../apache/juneau/cp/BeanCreateMethodFinder.java   |  7 +-
 .../java/org/apache/juneau/cp/BeanCreator.java     |  5 +-
 .../main/java/org/apache/juneau/cp/BeanStore.java  |  3 +-
 .../apache/juneau/html/HtmlBeanPropertyMeta.java   | 13 +--
 .../org/apache/juneau/httppart/HttpPartSchema.java |  8 +-
 .../juneau/httppart/bean/RequestBeanMeta.java      |  3 +-
 .../juneau/httppart/bean/ResponseBeanMeta.java     |  3 +-
 .../org/apache/juneau/internal/ClassUtils2.java    |  7 +-
 .../java/org/apache/juneau/internal/Utils2.java    |  8 +-
 .../java/org/apache/juneau/parser/ParserSet.java   |  7 +-
 .../java/org/apache/juneau/reflect/Mutaters.java   |  9 ++-
 .../juneau/serializer/SerializerSession.java       | 19 ++---
 .../apache/juneau/serializer/SerializerSet.java    |  7 +-
 .../org/apache/juneau/svl/VarResolverSession.java  | 19 ++---
 .../java/org/apache/juneau/swap/BuilderSwap.java   | 23 +++---
 .../java/org/apache/juneau/swap/ObjectSwap.java    | 15 ++--
 .../java/org/apache/juneau/swap/SurrogateSwap.java |  7 +-
 .../java/org/apache/juneau/swaps/TemporalSwap.java |  7 +-
 41 files changed, 353 insertions(+), 237 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 0f77042d81..9c4363b075 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
@@ -16,6 +16,7 @@
  */
 package org.apache.juneau.assertions;
 
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
 import static org.apache.juneau.common.utils.AssertionUtils.*;
 
 import java.io.*;
@@ -502,6 +503,6 @@ public class FluentAnyAssertion<T,R> extends 
FluentObjectAssertion<T,R> {
                Object o = orElse(null);
                if (o == null || c.isInstance(o))
                        return c.cast(o);
-               throw new BasicAssertionError(MSG_objectWasNotType, 
ClassInfo.of(c).getNameFull(), o.getClass());
+               throw new BasicAssertionError(MSG_objectWasNotType, 
info(c).getNameFull(), o.getClass());
        }
 }
\ No newline at end of file
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 2d170d21d1..8b4fe22c14 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
@@ -16,6 +16,7 @@
  */
 package org.apache.juneau.assertions;
 
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
 import static org.apache.juneau.common.utils.AssertionUtils.*;
 import static org.apache.juneau.common.utils.StringUtils.*;
 import static org.apache.juneau.common.utils.ThrowableUtils.*;
@@ -504,7 +505,7 @@ public class FluentObjectAssertion<T,R> extends 
FluentAssertion<R> {
         */
        public R isType(Class<?> parent) throws AssertionError {
                assertArgNotNull("parent", parent);
-               if (!ClassInfo.of(value()).isChildOf(parent))
+               if (! info(value()).isChildOf(parent))
                        throw error(MSG_unexpectedType, cn(parent), cn(value));
                return returns();
        }
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 8f362967d1..e0028c7cc8 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
@@ -18,6 +18,7 @@ package org.apache.juneau.junit.bct;
 
 import static java.util.Optional.*;
 import static java.util.stream.Collectors.*;
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
 import static org.apache.juneau.common.utils.AssertionUtils.*;
 import static org.apache.juneau.common.utils.CollectionUtils.*;
 import static org.apache.juneau.common.utils.ThrowableUtils.*;
@@ -827,7 +828,7 @@ public class BasicBeanConverter implements BeanConverter {
                if (sizer.isPresent()) return ((Sizer)sizer.get()).size(o2, 
this);
 
                // Try to find size() or length() method via reflection
-               var sizeResult = ClassInfo.of(c).getPublicMethods().stream()
+               var sizeResult = info(c).getPublicMethods().stream()
                        .filter(m -> ! m.hasParameters())
                        .filter(m -> m.hasAnyName("size", "length"))
                        .filter(m -> m.getReturnType().isAny(int.class, 
Integer.class))
@@ -840,7 +841,7 @@ public class BasicBeanConverter implements BeanConverter {
                if (canListify(o)) return listify(o).size();
 
                // Try to find isEmpty() method via reflection
-               var isEmpty = ClassInfo.of(o).getPublicMethods().stream()
+               var isEmpty = info(o).getPublicMethods().stream()
                        .filter(m -> ! m.hasParameters())
                        .filter(m -> m.hasName("isEmpty"))
                        .filter(m -> m.getReturnType().isAny(boolean.class, 
Boolean.class))
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 86a97eee06..063af2383e 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
@@ -16,16 +16,26 @@
  */
 package org.apache.juneau.common.reflect;
 
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
 import static org.apache.juneau.common.utils.AssertionUtils.*;
 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.
@@ -91,7 +101,7 @@ public class AnnotationInfo<T extends Annotation> {
        final int rank;
        private T a;  // Effectively final
 
-       private final Supplier<List<MethodInfo>> methods = memoize(() -> 
stream(a.annotationType().getMethods()).map(m -> 
MethodInfo.of(ClassInfo.of(a.annotationType()), m)).toList());
+private final Supplier<List<MethodInfo>> methods = memoize(() -> 
stream(a.annotationType().getMethods()).map(m -> 
MethodInfo.of(info(a.annotationType()), m)).toList());
 
        /**
         * Constructor.
@@ -321,7 +331,7 @@ public class AnnotationInfo<T extends Annotation> {
                var jm = new LinkedHashMap<String, Object>();
                jm.put(s(annotatable.getAnnotatableType()), 
annotatable.getLabel());
                var ja = new LinkedHashMap<String, Object>();
-               var ca = ClassInfo.of(a.annotationType());
+               var ca = info(a.annotationType());
                ca.getDeclaredMethods().stream().forEach(x -> {
                        try {
                                var v = x.invoke(a);
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 3a75917113..540639f7da 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
@@ -16,11 +16,12 @@
  */
 package org.apache.juneau.common.reflect;
 
+import static org.apache.juneau.common.reflect.AnnotationTraversal.*;
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
 import static org.apache.juneau.common.utils.AssertionUtils.*;
 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 static org.apache.juneau.common.reflect.AnnotationTraversal.*;
 
 import java.lang.annotation.*;
 import java.lang.reflect.*;
@@ -549,6 +550,7 @@ public class AnnotationProvider {
         * @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);
@@ -566,6 +568,7 @@ public class AnnotationProvider {
         * @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));
@@ -635,12 +638,19 @@ public class AnnotationProvider {
         * @param traversals The traversal options.
         * @return A stream 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) {
+               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.
         *
@@ -663,11 +673,17 @@ public class AnnotationProvider {
         * @param traversals The traversal options.
         * @return A stream 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) {
+               assertArgNotNull("m", m);
+               return cache.get(null, m, traversals);
+       }
+
        /**
         * Streams annotations from a method using configurable traversal 
options in parent-first order.
         *
@@ -681,6 +697,7 @@ public class AnnotationProvider {
         * @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);
@@ -698,6 +715,7 @@ public class AnnotationProvider {
         * @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));
@@ -741,7 +759,7 @@ 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 find(type, m, traversals).findFirst().isPresent();
+               return ! find2(type, m, traversals).isEmpty();
        }
 
        /**
@@ -783,12 +801,19 @@ public class AnnotationProvider {
         *      <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>.
         */
+       @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) {
+               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.
         *
@@ -824,6 +849,7 @@ public class AnnotationProvider {
         *      <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);
@@ -864,11 +890,17 @@ public class AnnotationProvider {
         *      <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>.
         */
+       @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) {
+               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.
         *
@@ -882,6 +914,7 @@ public class AnnotationProvider {
         *      <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));
@@ -924,7 +957,7 @@ 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 find(type, p, traversals).findFirst().isPresent();
+               return ! find2(type, p, traversals).isEmpty();
        }
 
        /**
@@ -946,12 +979,19 @@ public class AnnotationProvider {
         * @param traversals The traversal options.
         * @return A stream 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) {
+               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.
         *
@@ -970,11 +1010,17 @@ public class AnnotationProvider {
         * @param traversals The traversal options.
         * @return A stream 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) {
+               assertArgNotNull("f", f);
+               return cache.get(null, f, traversals);
+       }
+
        /**
         * Streams annotations from a field using configurable traversal 
options in parent-first order.
         *
@@ -988,6 +1034,7 @@ public class AnnotationProvider {
         * @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);
@@ -1005,6 +1052,7 @@ public class AnnotationProvider {
         * @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));
@@ -1042,7 +1090,7 @@ 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 find(type, f, traversals).findFirst().isPresent();
+               return ! find2(type, f, traversals).isEmpty();
        }
 
        /**
@@ -1064,10 +1112,10 @@ public class AnnotationProvider {
         * @param traversals The traversal options.
         * @return A stream of {@link AnnotationInfo} objects. Never 
<jk>null</jk>.
         */
-       public <A extends Annotation> Stream<AnnotationInfo<A>> find(Class<A> 
type, ConstructorInfo c, AnnotationTraversal... traversals) {
+       public <A extends Annotation> List<AnnotationInfo<A>> find(Class<A> 
type, ConstructorInfo c, AnnotationTraversal... traversals) {
                assertArgNotNull("type", type);
                assertArgNotNull("c", c);
-               return cache.get(type, c, traversals).stream();
+               return cache.get(type, c, traversals);
        }
 
        /**
@@ -1088,11 +1136,17 @@ public class AnnotationProvider {
         * @param traversals The traversal options.
         * @return A stream 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) {
+               assertArgNotNull("c", c);
+               return cache.get(null, c, traversals);
+       }
+
        /**
         * Streams annotations from a constructor using configurable traversal 
options in parent-first order.
         *
@@ -1106,6 +1160,7 @@ public class AnnotationProvider {
         * @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);
@@ -1123,6 +1178,7 @@ public class AnnotationProvider {
         * @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));
@@ -1160,7 +1216,7 @@ 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, 
ConstructorInfo c, AnnotationTraversal... traversals) {
-               return find(type, c, traversals).findFirst().isPresent();
+               return ! find(type, c, traversals).isEmpty();
        }
 
        
//-----------------------------------------------------------------------------------------------------------------
@@ -1172,18 +1228,18 @@ public class AnnotationProvider {
                        var ci = ClassInfo.of(c);
                        return annotationMap == null ? liste() : 
annotationMap.find(ci.inner()).map(a -> ai(ci, a)).toList();
                }
-               if (o instanceof Method m) {
-                       var mi = MethodInfo.of(m);
-                       return annotationMap == null ? liste() : 
annotationMap.find(mi.inner()).map(a -> ai(mi, a)).toList();
-               }
-               if (o instanceof Field f) {
-                       var fi = FieldInfo.of(f);
-                       return annotationMap == null ? liste() : 
annotationMap.find(fi.inner()).map(a -> ai(fi, a)).toList();
-               }
-               if (o instanceof Constructor c) {
-                       var ci = ConstructorInfo.of(c);
-                       return annotationMap == null ? liste() : 
annotationMap.find(ci.inner()).map(a -> ai(ci, a)).toList();
-               }
+       if (o instanceof Method m) {
+               var mi = info(m);
+               return annotationMap == null ? liste() : 
annotationMap.find(mi.inner()).map(a -> ai(mi, a)).toList();
+       }
+       if (o instanceof Field f) {
+               var fi = info(f);
+               return annotationMap == null ? liste() : 
annotationMap.find(fi.inner()).map(a -> ai(fi, a)).toList();
+       }
+       if (o instanceof Constructor c) {
+               var ci = info(c);
+               return annotationMap == null ? liste() : 
annotationMap.find(ci.inner()).map(a -> ai(ci, a)).toList();
+       }
                throw unsupportedOp();
        }
 
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 cfb9346605..5062c31fd2 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,6 +18,7 @@ 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.*;
@@ -754,9 +755,9 @@ public abstract class ExecutableInfo extends AccessibleInfo 
{
                } else {
                        genericTypes = ptt;
                }
-               return IntStream.range(0, rp.length)
-                       .mapToObj(i -> new ParameterInfo(this, rp[i], i, 
ClassInfo.of(ptc[i], genericTypes[i])))
-                       .toList();
+       return IntStream.range(0, rp.length)
+               .mapToObj(i -> new ParameterInfo(this, rp[i], i, 
ClassInfo.of(ptc[i], genericTypes[i])))
+               .toList();
        }
 
        private String findFullName() {
diff --git 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ReflectionUtils.java
 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ReflectionUtils.java
index 79acd404e9..6e21cfb089 100644
--- 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ReflectionUtils.java
+++ 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ReflectionUtils.java
@@ -32,7 +32,7 @@ public class ReflectionUtils {
         * @param o The class. Can be <jk>null</jk>.
         * @return The {@link ClassInfo} wrapper, or <jk>null</jk> if the input 
is <jk>null</jk>.
         */
-       public static final ClassInfo info(Class o) {
+       public static final ClassInfo info(Class<?> o) {
                return ClassInfo.of(o);
        }
 
@@ -72,7 +72,7 @@ public class ReflectionUtils {
         * @param o The constructor. Can be <jk>null</jk>.
         * @return The {@link ConstructorInfo} wrapper, or <jk>null</jk> if the 
input is <jk>null</jk>.
         */
-       public static final ConstructorInfo info(Constructor o) {
+       public static final ConstructorInfo info(Constructor<?> o) {
                return ConstructorInfo.of(o);
        }
 }
diff --git 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/utils/ClassUtils.java
 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/utils/ClassUtils.java
index 859c335f01..721e711aa0 100644
--- 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/utils/ClassUtils.java
+++ 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/utils/ClassUtils.java
@@ -16,6 +16,7 @@
  */
 package org.apache.juneau.common.utils;
 
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
 import static org.apache.juneau.common.utils.AssertionUtils.*;
 import static org.apache.juneau.common.utils.ThrowableUtils.*;
 import static org.apache.juneau.common.utils.Utils.*;
@@ -289,9 +290,9 @@ public class ClassUtils {
                if (! needsShuffle)
                        return args;
                var params = new Object[paramTypes.length];
-               for (var i = 0; i < paramTypes.length; i++) {
-                       var pt = 
ClassInfo.of(paramTypes[i]).getWrapperIfPrimitive();
-                       for (var arg : args) {
+       for (var i = 0; i < paramTypes.length; i++) {
+               var pt = info(paramTypes[i]).getWrapperIfPrimitive();
+               for (var arg : args) {
                                if (nn(arg) && pt.isParentOf(arg.getClass())) {
                                        params[i] = arg;
                                        break;
@@ -428,9 +429,9 @@ public class ClassUtils {
                // Pattern: com.example.MyClass$$EnhancerBySpringCGLIB$$abc123
                if (s.contains("$$EnhancerBySpringCGLIB$$")) {
                        // Try to invoke getTargetClass() if available (Spring 
specific)
-                       Value<Class<?>> v = Value.empty();
-                       ClassInfo.of(c).getPublicMethods().stream().filter(m -> 
m.hasName("getTargetClass") && m.getParameterCount() == 0 && 
m.hasReturnType(Class.class)).forEach(m -> safe(() -> v.set(m.invoke(o))));
-                       return v.isPresent() ? v.get() : c.getSuperclass();
+               Value<Class<?>> v = Value.empty();
+               info(c).getPublicMethods().stream().filter(m -> 
m.hasName("getTargetClass") && m.getParameterCount() == 0 && 
m.hasReturnType(Class.class)).forEach(m -> safe(() -> v.set(m.invoke(o))));
+               return v.isPresent() ? v.get() : c.getSuperclass();
                }
 
                // Javassist Proxy: Created by Javassist ProxyFactory
@@ -507,9 +508,9 @@ public class ClassUtils {
         *      Never <jk>null</jk>.
         */
        public static Stream<Annotation> streamRepeated(Annotation a) {
-               try {
-                       var ci = ClassInfo.of(a.annotationType());
-                       var mi = ci.getRepeatedAnnotationMethod();
+       try {
+               var ci = info(a.annotationType());
+               var mi = ci.getRepeatedAnnotationMethod();
                        if (nn(mi)) {
                                Annotation[] annotations = mi.invoke(a);
                                return Arrays.stream(annotations);
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java
index 625a01bd92..f9a92856b3 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java
@@ -17,6 +17,7 @@
 package org.apache.juneau;
 
 import static org.apache.juneau.collections.JsonMap.*;
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
 import static org.apache.juneau.common.reflect.Visibility.*;
 import static org.apache.juneau.common.utils.ClassUtils.*;
 import static org.apache.juneau.common.utils.CollectionUtils.*;
@@ -3520,9 +3521,9 @@ public class BeanContext extends Context {
                swaps.forEach(x -> {
                        if (x instanceof ObjectSwap) {
                                _swaps.add((ObjectSwap<?,?>)x);
-                       } else {
-                               var ci = ClassInfo.of((Class<?>)x);
-                               if (ci.isChildOf(ObjectSwap.class))
+               } else {
+                       var ci = info((Class<?>)x);
+                       if (ci.isChildOf(ObjectSwap.class))
                                        
_swaps.add(BeanCreator.of(ObjectSwap.class).type(ci).run());
                                else if (ci.isChildOf(Surrogate.class))
                                        
_swaps.addAll(SurrogateSwap.findObjectSwaps(ci.inner(), this));
@@ -4189,9 +4190,9 @@ public class BeanContext extends Context {
                        for (var p2 : notBeanPackagePrefixes)
                                if (p.getName().startsWith(p2))
                                        return true;
-               }
-               var ci = ClassInfo.of(c);
-               for (var exclude : notBeanClassesArray)
+       }
+       var ci = info(c);
+       for (var exclude : notBeanClassesArray)
                        if (ci.isChildOf(exclude))
                                return true;
                return false;
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 fd860da6b3..b5dc2adcac 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
@@ -18,6 +18,7 @@ package org.apache.juneau;
 
 import static org.apache.juneau.BeanMeta.MethodType.*;
 import static org.apache.juneau.common.reflect.AnnotationTraversal.*;
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
 import static org.apache.juneau.common.utils.CollectionUtils.*;
 import static org.apache.juneau.common.utils.PredicateUtils.*;
 import static org.apache.juneau.common.utils.StringUtils.*;
@@ -82,10 +83,10 @@ public class BeanMeta<T> {
                        this.propertyName = propertyName;
                        this.methodType = type;
                        this.method = method;
-                       if (type == MethodType.SETTER)
-                               this.type = 
ClassInfo.of(method.getParameterTypes()[0]);
-                       else
-                               this.type = 
ClassInfo.of(method.getReturnType());
+               if (type == MethodType.SETTER)
+                       this.type = info(method.getParameterTypes()[0]);
+               else
+                       this.type = info(method.getReturnType());
                }
 
                @Override /* Overridden from Object */
@@ -255,7 +256,7 @@ public class BeanMeta<T> {
                                                throw bex(c, "Multiple 
instances of '@Beanc' found.");
                                        constructor = x;
                                        constructorArgs = new String[0];
-                                       ap.find(Beanc.class, x).map(x2 -> 
x2.inner().properties()).filter(StringUtils::isNotBlank).forEach(z -> 
constructorArgs = splita(z));
+                                       ap.find(Beanc.class, x).stream().map(x2 
-> 
x2.inner().properties()).filter(StringUtils::isNotBlank).findFirst().ifPresent(z
 -> constructorArgs = splita(z));
                                        if (! 
x.hasNumParameters(constructorArgs.length)) {
                                                if (constructorArgs.length != 0)
                                                throw bex(c, "Number of 
properties defined in '@Beanc' annotation does not match number of parameters 
in constructor.");
@@ -278,7 +279,7 @@ public class BeanMeta<T> {
                                                        throw bex(c, "Multiple 
instances of '@Beanc' found.");
                                                constructor = x;
                                                constructorArgs = new String[0];
-                                               ap.find(Beanc.class, x).map(x2 
-> x2.inner().properties()).filter(y -> isNotEmpty(y)).forEach(z -> 
constructorArgs = splita(z));
+                                               ap.find(Beanc.class, 
x).stream().map(x2 -> x2.inner().properties()).filter(y -> 
isNotEmpty(y)).findFirst().ifPresent(z -> constructorArgs = splita(z));
                                                if (! 
x.hasNumParameters(constructorArgs.length)) {
                                                        if 
(constructorArgs.length != 0)
                                                        throw bex(c, "Number of 
properties defined in '@Beanc' annotation does not match number of parameters 
in constructor.");
@@ -360,9 +361,9 @@ public class BeanMeta<T> {
 
                                } else /* Use 'better' introspection */ {
 
-                                       findBeanFields(ctx, c2, stopClass, 
fVis).forEach(x -> {
-                                               String name = 
findPropertyName(FieldInfo.of(x));
-                                               if (nn(name)) {
+                               findBeanFields(ctx, c2, stopClass, 
fVis).forEach(x -> {
+                                       String name = findPropertyName(info(x));
+                                       if (nn(name)) {
                                                        if (! 
normalProps.containsKey(name))
                                                                
normalProps.put(name, BeanPropertyMeta.builder(beanMeta, name));
                                                        
normalProps.get(name).setField(x);
@@ -374,17 +375,17 @@ public class BeanMeta<T> {
                                        // Iterate through all the getters.
                                        bms.forEach(x -> {
                                                String pn = x.propertyName;
-                                               Method m = x.method;
-                                               MethodInfo mi = 
MethodInfo.of(m);
-                                               if (! 
normalProps.containsKey(pn))
+                                       Method m = x.method;
+                                       MethodInfo mi = info(m);
+                                       if (! normalProps.containsKey(pn))
                                                        normalProps.put(pn, new 
BeanPropertyMeta.Builder(beanMeta, pn));
                                                BeanPropertyMeta.Builder bpm = 
normalProps.get(pn);
                                                if (x.methodType == GETTER) {
                                                        // Two getters.  Pick 
the best.
                                                        if (nn(bpm.getter)) {
 
-                                                               if (! 
ap.has(Beanp.class, mi) && ap.has(Beanp.class, MethodInfo.of(bpm.getter)))
-                                                                       m = 
bpm.getter;  // @Beanp annotated method takes precedence.
+                                                       if (! 
ap.has(Beanp.class, mi) && ap.has(Beanp.class, info(bpm.getter)))
+                                                               m = bpm.getter; 
 // @Beanp annotated method takes precedence.
 
                                                                else if 
(m.getName().startsWith("is") && bpm.getter.getName().startsWith("get"))
                                                                        m = 
bpm.getter;  // getX() overrides isX().
@@ -566,8 +567,8 @@ public class BeanMeta<T> {
 
        static final Collection<Field> findBeanFields(BeanContext ctx, Class<?> 
c, Class<?> stopClass, Visibility v) {
                List<Field> l = new LinkedList<>();
-               boolean noIgnoreTransients = ! ctx.isIgnoreTransientFields();
-               forEachClass(ClassInfo.of(c), stopClass, c2 -> {
+       boolean noIgnoreTransients = ! ctx.isIgnoreTransientFields();
+       forEachClass(info(c), stopClass, c2 -> {
                        // @formatter:off
                        c2.getDeclaredFields().stream()
                                .filter(x -> x.isNotStatic()
@@ -595,8 +596,8 @@ public class BeanMeta<T> {
                List<BeanMethod> l = new LinkedList<>();
                var ap = ctx.getAnnotationProvider();
 
-               forEachClass(ClassInfo.of(c), stopClass, c2 -> {
-                       for (var m : c2.getDeclaredMethods()) {
+       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()
@@ -707,8 +708,8 @@ public class BeanMeta<T> {
 
        static final Field findInnerBeanField(BeanContext ctx, Class<?> c, 
Class<?> stopClass, String name) {
                boolean noIgnoreTransients = ! ctx.isIgnoreTransientFields();
-               Value<Field> value = Value.empty();
-               forEachClass(ClassInfo.of(c), stopClass, c2 -> {
+       Value<Field> value = Value.empty();
+       forEachClass(info(c), stopClass, c2 -> {
                        // @formatter:off
                        c2.getDeclaredField(
                                x -> x.isNotStatic()
@@ -803,9 +804,9 @@ public class BeanMeta<T> {
                List<ParameterInfo> params = method.getParameters();
                var ap = ctx.getAnnotationProvider();
 
-               // Walk up the class hierarchy looking for a matching parent 
method with @Beanp or @Name
-               var currentClass = ClassInfo.of(c);
-               ClassInfo sc = currentClass.getSuperclass();
+       // Walk up the class hierarchy looking for a matching parent method 
with @Beanp or @Name
+       var currentClass = info(c);
+       ClassInfo sc = currentClass.getSuperclass();
 
                while (nn(sc) && ! sc.is(stopClass) && ! sc.is(Object.class)) {
                        // Look for a method with the same signature in the 
parent class
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 c41bc801f2..89c8d3d370 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
@@ -147,9 +147,9 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                        if (isVoid(c))
                                c = s.impl();
                        if (isVoid(c))
-                               return null;
-                       var ci = ClassInfo.of(c);
-                       if (ci.isChildOf(ObjectSwap.class)) {
+                       return null;
+               var ci = info(c);
+               if (ci.isChildOf(ObjectSwap.class)) {
                                ObjectSwap ps = 
BeanCreator.of(ObjectSwap.class).type(c).run();
                                if (nn(ps.forMediaTypes()))
                                        throw unsupportedOp("TODO - Media types 
on swaps not yet supported on bean properties.");
@@ -221,9 +221,9 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                        canRead |= (nn(field) || nn(getter));
                        canWrite |= (nn(field ) || nn(setter));
 
-                       var ifi = innerField == null ? null : 
FieldInfo.of(innerField);
-                       var gi = getter == null ? null : MethodInfo.of(getter);
-                       var si = setter == null ? null : MethodInfo.of(setter);
+               var ifi = innerField == null ? null : info(innerField);
+               var gi = getter == null ? null : info(getter);
+               var si = setter == null ? null : info(setter);
 
                        if (nn(innerField)) {
                                List<Beanp> lp = list();
@@ -329,9 +329,9 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                                }
                        }
                        if (nn(field)) {
-                               if (isDyna) {
-                                       if (! 
ClassInfo.of(field.getType()).isChildOf(Map.class))
-                                               return false;
+                       if (isDyna) {
+                               if (! 
info(field.getType()).isChildOf(Map.class))
+                                       return false;
                                } else {
                                        if (! ci.isChildOf(field.getType()))
                                                return false;
@@ -644,10 +644,10 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
        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, 
FieldInfo.of(field)).map(x -> x.inner()).filter(filter).forEach(action);
-                       if (nn(getter)) bc.getAnnotationProvider().find(a, 
MethodInfo.of(getter), SELF, MATCHING_METHODS, RETURN_TYPE, PACKAGE).map(x -> 
x.inner()).filter(filter).forEach(action);
-                       if (nn(setter)) bc.getAnnotationProvider().find(a, 
MethodInfo.of(setter), SELF, MATCHING_METHODS, RETURN_TYPE, PACKAGE).map(x -> 
x.inner()).filter(filter).forEach(action);
-               }
+               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);
+       }
                return this;
        }
 
@@ -686,10 +686,10 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                List<A> l = new LinkedList<>();
                BeanContext bc = beanContext;
                var ap = bc.getAnnotationProvider();
-               var fi = field == null ? null : FieldInfo.of(field);
-               var gi = getter == null ? null : MethodInfo.of(getter);
-               var si = setter == null ? null : MethodInfo.of(setter);
-               if (a == null)
+       var fi = field == null ? null : info(field);
+       var gi = getter == null ? null : info(getter);
+       var si = setter == null ? null : info(setter);
+       if (a == null)
                        return l;
                rstream(ap.find(a, 
getBeanMeta().getClassMeta().getInfo())).forEach(x -> l.add(x.inner()));
                if (nn(field)) {
@@ -698,23 +698,23 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                }
                if (nn(gi)) {
                        // Walk up the inheritance hierarchy for the getter 
method
-                       forEachParentMethod(getter, parentGetter -> {
-                               ap.find(a, MethodInfo.of(parentGetter), SELF, 
MATCHING_METHODS, RETURN_TYPE, PACKAGE).forEach(x -> l.add(x.inner()));
-                       });
+               forEachParentMethod(getter, parentGetter -> {
+                       ap.find(a, info(parentGetter), SELF, MATCHING_METHODS, 
RETURN_TYPE, PACKAGE).forEach(x -> l.add(x.inner()));
+               });
                        ap.find(a, gi, SELF, MATCHING_METHODS, RETURN_TYPE, 
PACKAGE).forEach(x -> l.add(x.inner()));
                        rstream(ap.find(a, gi.getReturnType())).forEach(x -> 
l.add(x.inner()));
                }
                if (nn(setter)) {
                        // Walk up the inheritance hierarchy for the setter 
method
-                       forEachParentMethod(setter, parentSetter -> {
-                               ap.find(a, MethodInfo.of(parentSetter), SELF, 
MATCHING_METHODS, RETURN_TYPE, PACKAGE).forEach(x -> l.add(x.inner()));
-                       });
+               forEachParentMethod(setter, parentSetter -> {
+                       ap.find(a, info(parentSetter), SELF, MATCHING_METHODS, 
RETURN_TYPE, PACKAGE).forEach(x -> l.add(x.inner()));
+               });
                        ap.find(a, si, SELF, MATCHING_METHODS, RETURN_TYPE, 
PACKAGE).forEach(x -> l.add(x.inner()));
                        rstream(ap.find(a, 
info(setter.getReturnType()))).forEach(x -> l.add(x.inner()));
                }
-               if (nn(extraKeys)) {
-                       MethodInfo eki = MethodInfo.of(extraKeys);
-                       // Walk up the inheritance hierarchy for the extraKeys 
method
+       if (nn(extraKeys)) {
+               MethodInfo eki = info(extraKeys);
+               // Walk up the inheritance hierarchy for the extraKeys method
                        forEachParentMethod(extraKeys, parentExtraKeys -> {
                                ap.find(a, info(parentExtraKeys), SELF, 
MATCHING_METHODS, RETURN_TYPE, PACKAGE).forEach(x -> l.add(x.inner()));
                        });
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 7b356dbeca..7be205cf29 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
@@ -16,6 +16,7 @@
  */
 package org.apache.juneau;
 
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
 import static org.apache.juneau.common.utils.ThrowableUtils.*;
 import static org.apache.juneau.common.utils.Utils.*;
 
@@ -57,9 +58,9 @@ public class BeanProxyInvocationHandler<T> implements 
InvocationHandler {
         * Implemented to handle the method called.
         */
        @Override /* Overridden from InvocationHandler */
-       public Object invoke(Object proxy, Method method, Object[] args) {
-               var mi = MethodInfo.of(method);
-               if (mi.hasName("equals") && 
mi.hasParameterTypes(java.lang.Object.class)) {
+public Object invoke(Object proxy, Method method, Object[] args) {
+       var mi = info(method);
+       if (mi.hasName("equals") && 
mi.hasParameterTypes(java.lang.Object.class)) {
                        Object arg = args[0];
                        if (arg == null)
                                return false;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanRegistry.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanRegistry.java
index 1fd2b96c87..f8a1068048 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanRegistry.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanRegistry.java
@@ -16,6 +16,7 @@
  */
 package org.apache.juneau;
 
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
 import static org.apache.juneau.common.utils.ThrowableUtils.*;
 import static org.apache.juneau.common.utils.Utils.*;
 
@@ -125,9 +126,9 @@ public class BeanRegistry {
 
        private void addClass(Class<?> c) {
                try {
-                       if (nn(c)) {
-                               var ci = ClassInfo.of(c);
-                               if (ci.isChildOf(Collection.class)) {
+               if (nn(c)) {
+                       var ci = info(c);
+                       if (ci.isChildOf(Collection.class)) {
                                        Collection<?> cc = 
BeanCreator.of(Collection.class).type(c).run();
                                        cc.forEach(x -> {
                                                if (x instanceof Class)
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
index 140dac6f90..c0856761c2 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
@@ -17,6 +17,7 @@
 package org.apache.juneau;
 
 import static org.apache.juneau.ClassMeta.ClassCategory.*;
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
 import static org.apache.juneau.common.utils.CollectionUtils.*;
 import static org.apache.juneau.common.utils.PredicateUtils.*;
 import static org.apache.juneau.common.utils.ThrowableUtils.*;
@@ -112,8 +113,8 @@ public class ClassMeta<T> implements Type {
                                this.childUnswapMap = new ConcurrentHashMap<>();
                        }
 
-                       Class<T> c = innerClass;
-                       ci = ClassInfo.of(c);
+               Class<T> c = innerClass;
+               ci = info(c);
 
                        if (c.isPrimitive()) {
                                if (c == Boolean.TYPE)
@@ -293,9 +294,9 @@ public class ClassMeta<T> implements Type {
                                        implClass = (Class<? extends 
T>)marshalledFilter.getImplClass();
                        }
 
-                       if (innerClass != Object.class) {
-                               ClassInfo x = implClass == null ? ci : 
ClassInfo.of(implClass);
-                               noArgConstructor = x.getPublicConstructor(cons 
-> cons.getParameterCount() == 0).orElse(null);
+               if (innerClass != Object.class) {
+                       ClassInfo x = implClass == null ? ci : info(implClass);
+                       noArgConstructor = x.getPublicConstructor(cons -> 
cons.getParameterCount() == 0).orElse(null);
                        }
 
                        try {
@@ -440,8 +441,8 @@ public class ClassMeta<T> implements Type {
                private ObjectSwap<T,?> createSwap(Swap s) {
                        Class<?> c = s.value();
                        if (ClassUtils.isVoid(c))
-                               c = s.impl();
-                       ClassInfo ci = ClassInfo.of(c);
+                       c = s.impl();
+               ClassInfo ci = info(c);
 
                        if (ci.isChildOf(ObjectSwap.class)) {
                                ObjectSwap ps = 
BeanCreator.of(ObjectSwap.class).type(c).run();
@@ -461,33 +462,35 @@ public class ClassMeta<T> implements Type {
                        throw new ClassMetaRuntimeException(c, "Invalid swap 
class ''{0}'' specified.  Must extend from ObjectSwap or Surrogate.", c);
                }
 
-               private BeanFilter findBeanFilter(BeanContext bc) {
-                       try {
-                               List<Bean> ba = list();
-                               
rstream(bc.getAnnotationProvider().find(Bean.class, info)).forEach(x -> 
ba.add(x.inner()));
-                               if (! ba.isEmpty())
-                                       return 
BeanFilter.create(innerClass).applyAnnotations(ba).build();
-                       } catch (Exception e) {
-                               throw toRex(e);
-                       }
-                       return null;
+       private BeanFilter findBeanFilter(BeanContext bc) {
+               try {
+                       var ba = 
rstream(bc.getAnnotationProvider().find(Bean.class, info))
+                               .map(AnnotationInfo::inner)
+                               .toList();
+                       if (! ba.isEmpty())
+                               return 
BeanFilter.create(innerClass).applyAnnotations(ba).build();
+               } catch (Exception e) {
+                       throw toRex(e);
                }
+               return null;
+       }
 
                private ClassMeta<?> findClassMeta(Class<?> c) {
                        return beanContext.getClassMeta(c, false);
                }
 
-               private MarshalledFilter findMarshalledFilter(BeanContext bc) {
-                       try {
-                               List<Marshalled> ba = list();
-                               
bc.getAnnotationProvider().findTopDown(Marshalled.class, info).map(x -> 
x.inner()).forEach(x -> ba.add(x));
-                               if (! ba.isEmpty())
-                                       return 
MarshalledFilter.create(innerClass).applyAnnotations(ba).build();
-                       } catch (Exception e) {
-                               throw toRex(e);
-                       }
-                       return null;
+       private MarshalledFilter findMarshalledFilter(BeanContext bc) {
+               try {
+                       var ba = 
rstream(bc.getAnnotationProvider().find(Marshalled.class, info))
+                               .map(AnnotationInfo::inner)
+                               .toList();
+                       if (! ba.isEmpty())
+                               return 
MarshalledFilter.create(innerClass).applyAnnotations(ba).build();
+               } catch (Exception e) {
+                       throw toRex(e);
                }
+               return null;
+       }
 
                private ClassMeta<?>[] findParameters() {
                        return beanContext.findParameters(innerClass, 
innerClass);
@@ -546,7 +549,7 @@ public class ClassMeta<T> implements Type {
         */
        @SuppressWarnings({ "unchecked" })
        protected static <T> Constructor<? extends T> 
findNoArgConstructor(Class<?> c, Visibility v) {
-               ClassInfo ci = ClassInfo.of(c);
+               ClassInfo ci = info(c);
                if (ci.isAbstract())
                        return null;
                boolean isMemberClass = ci.isMemberClass() && ci.isNotStatic();
@@ -629,9 +632,9 @@ public class ClassMeta<T> implements Type {
         */
        @SuppressWarnings({ "rawtypes", "unchecked" })
        ClassMeta(Class<T> innerClass, BeanContext beanContext, 
ObjectSwap<T,?>[] swaps, ObjectSwap<?,?>[] childSwaps) {
-               this.innerClass = innerClass;
-               this.info = ClassInfo.of(innerClass);
-               this.beanContext = beanContext;
+       this.innerClass = innerClass;
+       this.info = info(innerClass);
+       this.beanContext = beanContext;
                String notABeanReason = null;
 
                try (SimpleLock x = lock.write()) {
@@ -687,9 +690,9 @@ public class ClassMeta<T> implements Type {
         */
        @SuppressWarnings("unchecked")
        ClassMeta(ClassMeta<?>[] args) {
-               this.innerClass = (Class<T>)Object[].class;
-               this.info = ClassInfo.of(innerClass);
-               this.args = args;
+       this.innerClass = (Class<T>)Object[].class;
+       this.info = info(innerClass);
+       this.args = args;
                this.implClass = null;
                this.childSwaps = null;
                this.childSwapMap = null;
@@ -985,9 +988,9 @@ public class ClassMeta<T> implements Type {
                try {
                        if (nn(example))
                                return jpSession.parse(example, this);
-                       if (nn(exampleMethod))
-                               return 
(T)MethodInfo.of(exampleMethod).invokeLenient(null, session);
-                       if (nn(exampleField))
+               if (nn(exampleMethod))
+                       return (T)info(exampleMethod).invokeLenient(null, 
session);
+               if (nn(exampleField))
                                return (T)exampleField.get(null);
 
                        if (isCollection()) {
@@ -1061,9 +1064,9 @@ public class ClassMeta<T> implements Type {
         * @return The no-arg constructor for this class, or <jk>null</jk> if 
it does not exist.
         */
        public ConstructorInfo getImplClassConstructor(Visibility conVis) {
-               if (nn(implClass))
-                       return 
ClassInfo.of(implClass).getNoArgConstructor(conVis).orElse(null);
-               return null;
+       if (nn(implClass))
+               return info(implClass).getNoArgConstructor(conVis).orElse(null);
+       return null;
        }
 
        /**
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 6dff83f4b3..4d949ca3ad 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
@@ -17,6 +17,7 @@
 package org.apache.juneau;
 
 import static org.apache.juneau.collections.JsonMap.*;
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
 import static org.apache.juneau.common.utils.CollectionUtils.*;
 import static org.apache.juneau.common.utils.ThrowableUtils.*;
 import static org.apache.juneau.common.utils.Utils.*;
@@ -647,9 +648,9 @@ public abstract class Context {
                private ConstructorInfo getContextConstructor() {
                        ConstructorInfo cci = CONTEXT_CONSTRUCTORS.get(type);
                        if (cci == null) {
-                               // @formatter:off
-                               cci = ClassInfo.of(type).getPublicConstructor(
-                                       x -> x.hasNumParameters(1)
+                       // @formatter:off
+                       cci = info(type).getPublicConstructor(
+                               x -> x.hasNumParameters(1)
                                        && x.getParameter(0).canAccept(this)
                                ).orElseThrow(() -> rex("Public constructor not 
found: {0}({1})", cn(type), cn(this)));
                                // @formatter:on
@@ -671,13 +672,13 @@ public abstract class Context {
                private static AnnotationWorkList traverse(AnnotationWorkList 
work, Object x) {
                        AnnotationProvider ap = AnnotationProvider.INSTANCE;
                        CollectionUtils.traverse(x, y -> {
-                               if (x instanceof Class<?> x2)
-                                       
work.add(ap.findTopDown(ClassInfo.of(x2)).filter(CONTEXT_APPLY_FILTER));
-                               else if (x instanceof ClassInfo x2)
+                       if (x instanceof Class<?> x2)
+                               
work.add(ap.findTopDown(info(x2)).filter(CONTEXT_APPLY_FILTER));
+                       else if (x instanceof ClassInfo x2)
                                        
work.add(ap.findTopDown(x2).filter(CONTEXT_APPLY_FILTER));
-                               else if (x instanceof Method x2)
-                                       
work.add(ap.findTopDown(MethodInfo.of(x2)).filter(CONTEXT_APPLY_FILTER));
-                               else if (x instanceof MethodInfo x2)
+                       else if (x instanceof Method x2)
+                               
work.add(ap.findTopDown(info(x2)).filter(CONTEXT_APPLY_FILTER));
+                       else if (x instanceof MethodInfo x2)
                                        
work.add(ap.findTopDown(x2).filter(CONTEXT_APPLY_FILTER));
                                else
                                        illegalArg("Invalid type passed to 
applyAnnotations:  {0}", cn(x));
@@ -725,9 +726,9 @@ public abstract class Context {
        public static Builder createBuilder(Class<? extends Context> type) {
                try {
                        MethodInfo mi = BUILDER_CREATE_METHODS.get(type);
-                       if (mi == null) {
-                               var c = ClassInfo.of(type);
-                               for (var ci : c.getPublicConstructors()) {
+               if (mi == null) {
+                       var c = info(type);
+                       for (var ci : c.getPublicConstructors()) {
                                        if (ci.hasNumParameters(1) && ! 
ci.getParameter(0).getParameterType().is(type)) {
                                                // @formatter:off
                                                mi = c.getPublicMethod(
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 1c8f7b4a65..03ef7d2fb5 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
@@ -16,6 +16,7 @@
  */
 package org.apache.juneau;
 
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
 import static org.apache.juneau.common.utils.Utils.*;
 
 import java.text.*;
@@ -41,11 +42,11 @@ public class InvalidDataConversionException extends 
BasicRuntimeException {
        private static final long serialVersionUID = 1L;
 
        private static String name(Class<?> c) {
-               return ClassInfo.of(c).getNameFull();
+               return info(c).getNameFull();
        }
 
        private static String name(Object o) {
-               return ClassInfo.of(o).getNameFull();
+               return info(o).getNameFull();
        }
 
        private static String value(Object o) {
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 746583f766..518735c505 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
@@ -16,6 +16,8 @@
  */
 package org.apache.juneau.annotation;
 
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
+
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 
@@ -48,7 +50,7 @@ public class TargetedAnnotationCBuilder<B extends 
TargetedAnnotationCBuilder<B>>
         */
        public B on(Constructor<?>...value) {
                for (var v : value)
-                       on(ConstructorInfo.of(v).getFullName());
+                       on(info(v).getFullName());
                return asThis();
        }
 }
\ No newline at end of file
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 d03e18a315..2f74499ec6 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
@@ -16,6 +16,8 @@
  */
 package org.apache.juneau.annotation;
 
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
+
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 
@@ -48,7 +50,7 @@ public class TargetedAnnotationMBuilder<B extends 
TargetedAnnotationMBuilder<B>>
         */
        public B on(Method...value) {
                for (var v : value)
-                       on(MethodInfo.of(v).getFullName());
+                       on(info(v).getFullName());
                return asThis();
        }
 }
\ No newline at end of file
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 7638c5462e..8e6d86998a 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
@@ -16,6 +16,8 @@
  */
 package org.apache.juneau.annotation;
 
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
+
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 
@@ -48,7 +50,7 @@ public class TargetedAnnotationMFBuilder<B extends 
TargetedAnnotationMFBuilder<B
         */
        public B on(Field...value) {
                for (var v : value)
-                       on(FieldInfo.of(v).getFullName());
+                       on(info(v).getFullName());
                return asThis();
        }
 
@@ -60,7 +62,7 @@ public class TargetedAnnotationMFBuilder<B extends 
TargetedAnnotationMFBuilder<B
         */
        public B on(Method...value) {
                for (var v : value)
-                       on(MethodInfo.of(v).getFullName());
+                       on(info(v).getFullName());
                return asThis();
        }
 }
\ No newline at end of file
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 05f076e552..f2b773fafc 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
@@ -16,6 +16,8 @@
  */
 package org.apache.juneau.annotation;
 
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
+
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 
@@ -46,7 +48,7 @@ public class TargetedAnnotationMFCBuilder extends 
TargetedAnnotationMFBuilder<Ta
         */
        public TargetedAnnotationMFCBuilder on(Constructor<?>...value) {
                for (var v : value)
-                       on(ConstructorInfo.of(v).getFullName());
+                       on(info(v).getFullName());
                return this;
        }
 }
\ No newline at end of file
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 0a62a6b4e6..89fc895fa5 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
@@ -16,6 +16,8 @@
  */
 package org.apache.juneau.annotation;
 
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
+
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 
@@ -48,7 +50,7 @@ public class TargetedAnnotationTMBuilder<B extends 
TargetedAnnotationTMBuilder<B
         */
        public B on(Method...value) {
                for (var v : value)
-                       on(MethodInfo.of(v).getFullName());
+                       on(info(v).getFullName());
                return asThis();
        }
 }
\ No newline at end of file
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 8e8f41f270..a4cd36d75e 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
@@ -16,6 +16,8 @@
  */
 package org.apache.juneau.annotation;
 
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
+
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 
@@ -48,7 +50,7 @@ public class TargetedAnnotationTMFBuilder<B extends 
TargetedAnnotationTMFBuilder
         */
        public B on(Field...value) {
                for (var v : value)
-                       on(FieldInfo.of(v).getFullName());
+                       on(info(v).getFullName());
                return asThis();
        }
 
@@ -60,7 +62,7 @@ public class TargetedAnnotationTMFBuilder<B extends 
TargetedAnnotationTMFBuilder
         */
        public B on(Method...value) {
                for (var v : value)
-                       on(MethodInfo.of(v).getFullName());
+                       on(info(v).getFullName());
                return asThis();
        }
 }
\ No newline at end of file
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 fb47c64698..90e7c9f8fa 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
@@ -16,6 +16,8 @@
  */
 package org.apache.juneau.annotation;
 
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
+
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 
@@ -48,7 +50,7 @@ public class TargetedAnnotationTMFCBuilder<B extends 
TargetedAnnotationTMFCBuild
         */
        public B on(Constructor<?>...value) {
                for (var v : value)
-                       on(ConstructorInfo.of(v).getFullName());
+                       on(info(v).getFullName());
                return asThis();
        }
 }
\ No newline at end of file
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreateMethodFinder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreateMethodFinder.java
index dc6e6a9554..4012fecc6a 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreateMethodFinder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreateMethodFinder.java
@@ -16,6 +16,7 @@
  */
 package org.apache.juneau.cp;
 
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
 import static org.apache.juneau.common.utils.AssertionUtils.*;
 import static org.apache.juneau.common.utils.Utils.*;
 
@@ -144,9 +145,9 @@ public class BeanCreateMethodFinder<T> {
         */
        public BeanCreateMethodFinder<T> find(Predicate<MethodInfo> filter) {
                // @formatter:off
-               if (method == null) {
-                       ClassInfo.of(resourceClass).getPublicMethod(
-                               x -> x.isNotDeprecated()
+       if (method == null) {
+               info(resourceClass).getPublicMethod(
+                       x -> x.isNotDeprecated()
                                && x.hasReturnType(beanType)
                                && ! x.hasAnnotation(BeanIgnore.class)
                                && filter.test(x)
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreator.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreator.java
index 32c5459aab..e7070ef522 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreator.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreator.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.cp;
 
 import static java.util.stream.Collectors.*;
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
 import static org.apache.juneau.common.reflect.Visibility.*;
 import static org.apache.juneau.common.utils.Utils.*;
 
@@ -160,7 +161,7 @@ public class BeanCreator<T> {
         * @param store The bean store creating this creator.
         */
        protected BeanCreator(Class<T> type, BeanStore store) {
-               this.type = ClassInfo.of(type);
+               this.type = info(type);
                this.store = BeanStore.of(store, store.outer.orElse(null));
        }
 
@@ -390,7 +391,7 @@ public class BeanCreator<T> {
         * @return This object.
         */
        public BeanCreator<T> type(Class<?> value) {
-               type = opt(value).map(x -> ClassInfo.of(x)).orElse(null);
+               type = opt(value).map(x -> info(x)).orElse(null);
                return this;
        }
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanStore.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanStore.java
index b7d8b3f8cf..e5d4ccd4f7 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanStore.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanStore.java
@@ -19,6 +19,7 @@ package org.apache.juneau.cp;
 import static java.util.stream.Collectors.*;
 import static java.util.stream.Collectors.toList;
 import static org.apache.juneau.collections.JsonMap.*;
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
 import static org.apache.juneau.common.utils.CollectionUtils.*;
 import static org.apache.juneau.common.utils.StringUtils.*;
 import static org.apache.juneau.common.utils.ThrowableUtils.*;
@@ -113,7 +114,7 @@ public class BeanStore {
                        if (type == null || type == BeanStore.class)
                                return new BeanStore(this);
 
-                       var c = ClassInfo.of(type);
+               var c = info(type);
 
                        // @formatter:off
                        Optional<BeanStore> result = c.getDeclaredMethod(
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 528a8020f2..ca2a3213bd 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
@@ -16,6 +16,7 @@
  */
 package org.apache.juneau.html;
 
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
 import static org.apache.juneau.common.utils.Utils.*;
 
 import org.apache.juneau.*;
@@ -80,12 +81,12 @@ public class HtmlBeanPropertyMeta extends 
ExtendedBeanPropertyMeta {
                super(bpm);
 
                Builder b = new Builder();
-               if (nn(bpm.getInnerField()))
-                       annotationProvider.find(Html.class, 
FieldInfo.of(bpm.getInnerField())).map(x -> x.inner()).forEach(x -> 
b.findHtmlInfo(x));
-               if (nn(bpm.getGetter()))
-                       annotationProvider.find(Html.class, 
MethodInfo.of(bpm.getGetter())).map(x -> x.inner()).forEach(x -> 
b.findHtmlInfo(x));
-               if (nn(bpm.getSetter()))
-                       annotationProvider.find(Html.class, 
MethodInfo.of(bpm.getSetter())).map(x -> x.inner()).forEach(x -> 
b.findHtmlInfo(x));
+       if (nn(bpm.getInnerField()))
+               annotationProvider.find(Html.class, 
info(bpm.getInnerField())).map(x -> x.inner()).forEach(x -> b.findHtmlInfo(x));
+       if (nn(bpm.getGetter()))
+               annotationProvider.find(Html.class, 
info(bpm.getGetter())).map(x -> x.inner()).forEach(x -> b.findHtmlInfo(x));
+       if (nn(bpm.getSetter()))
+               annotationProvider.find(Html.class, 
info(bpm.getSetter())).map(x -> x.inner()).forEach(x -> b.findHtmlInfo(x));
 
                this.format = b.format;
                this.noTables = b.noTables;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchema.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchema.java
index 5a87bff3de..e62f1f2eee 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchema.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchema.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.httppart;
 
 import static java.util.Collections.*;
+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.list;
@@ -84,6 +85,9 @@ import org.apache.juneau.common.reflect.*;
  * </ul>
  */
 public class HttpPartSchema {
+
+       private static final AnnotationProvider AP = 
AnnotationProvider.INSTANCE;
+
        /**
         * Builder class.
         */
@@ -2547,8 +2551,8 @@ public class HttpPartSchema {
                }
 
                Builder apply(Class<? extends Annotation> c, 
java.lang.reflect.Type t) {
-                       if (t instanceof Class<?>) {
-                               AnnotationProvider.INSTANCE.findTopDown(c, 
ClassInfo.of((Class<?>)t)).map(AnnotationInfo::inner).forEach(this::apply);
+                       if (t instanceof Class<?> c2) {
+                               rstream(AP.find(c, info(c2))).forEach(x -> 
apply(x.inner()));
                        } else if (Value.isType(t)) {
                                apply(c, getValueParameterType(t));
                        }
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 7d6aee1e72..763af27661 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
@@ -16,6 +16,7 @@
  */
 package org.apache.juneau.httppart.bean;
 
+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.Utils.*;
@@ -109,7 +110,7 @@ public class RequestBeanMeta {
         * @return Metadata about the class, or <jk>null</jk> if class not 
annotated with {@link Request}.
         */
        public static RequestBeanMeta create(Class<?> c, AnnotationWorkList 
annotations) {
-               var ci = ClassInfo.of(c);
+               var ci = info(c);
                if (! ci.hasAnnotation(Request.class))
                        return null;
                return new 
RequestBeanMeta.Builder(annotations).apply(c).build();
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 e6fd406307..ba1662c328 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
@@ -17,6 +17,7 @@
 package org.apache.juneau.httppart.bean;
 
 import static org.apache.juneau.annotation.InvalidAnnotationException.*;
+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.Utils.*;
@@ -158,7 +159,7 @@ public class ResponseBeanMeta {
         * @return Metadata about the class, or <jk>null</jk> if class not 
annotated with {@link Response}.
         */
        public static ResponseBeanMeta create(Type t, AnnotationWorkList 
annotations) {
-               var ci = ClassInfo.of(t).unwrap(Value.class, Optional.class);
+               var ci = info(t).unwrap(Value.class, Optional.class);
                if (! ci.hasAnnotation(Response.class))
                        return null;
                var b = new Builder(annotations);
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 77565f1c9f..92f2ea2b14 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
@@ -16,6 +16,7 @@
  */
 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.*;
@@ -52,9 +53,9 @@ public class ClassUtils2 {
                if (! needsShuffle)
                        return args;
                Object[] params = new Object[paramTypes.length];
-               for (int i = 0; i < paramTypes.length; i++) {
-                       var pt = 
ClassInfo.of(paramTypes[i]).getWrapperIfPrimitive();
-                       for (var arg : args) {
+       for (int i = 0; i < paramTypes.length; i++) {
+               var pt = info(paramTypes[i]).getWrapperIfPrimitive();
+               for (var arg : args) {
                                if (nn(arg) && pt.isParentOf(arg.getClass())) {
                                        params[i] = arg;
                                        break;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/Utils2.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/Utils2.java
index 3232a14ebe..f3fc53dab5 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/Utils2.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/Utils2.java
@@ -16,6 +16,8 @@
  */
 package org.apache.juneau.internal;
 
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
+
 import java.util.*;
 import java.util.concurrent.*;
 
@@ -43,9 +45,9 @@ public class Utils2 extends Utils {
                if (o == null)
                        return null;
                Map<String,MethodInfo> methods = 
PROPERTIES_METHODS.get(o.getClass());
-               if (methods == null) {
-                       var ci = ClassInfo.of(o);
-                       var methods2 = new LinkedHashMap<String,MethodInfo>();
+       if (methods == null) {
+               var ci = info(o);
+               var methods2 = new LinkedHashMap<String,MethodInfo>();
                        do {
                                String cname = ci.getNameShort();
                                ci.getDeclaredMethod(x -> 
x.hasName("properties"))
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserSet.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserSet.java
index d61ed13759..572bb0aaa0 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserSet.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserSet.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.parser;
 
 import static java.util.stream.Collectors.*;
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
 import static org.apache.juneau.common.utils.CollectionUtils.*;
 import static org.apache.juneau.common.utils.ThrowableUtils.*;
 import static org.apache.juneau.common.utils.Utils.*;
@@ -387,9 +388,9 @@ public class ParserSet {
                private Object createBuilder(Object o) {
                        if (o instanceof Class) {
 
-                               // Check for no-arg constructor.
-                               ConstructorInfo ci = 
ClassInfo.of((Class<?>)o).getPublicConstructor(c -> c.getParameterCount() == 
0).orElse(null);
-                               if (nn(ci))
+                       // Check for no-arg constructor.
+                       ConstructorInfo ci = 
info((Class<?>)o).getPublicConstructor(c -> c.getParameterCount() == 
0).orElse(null);
+                       if (nn(ci))
                                        return ci.newInstance();
 
                                // Check for builder.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/Mutaters.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/Mutaters.java
index f1ad938548..2256264f2c 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/Mutaters.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/Mutaters.java
@@ -16,6 +16,7 @@
  */
 package org.apache.juneau.reflect;
 
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
 import static org.apache.juneau.common.utils.StringUtils.*;
 import static org.apache.juneau.common.utils.ThrowableUtils.*;
 import static org.apache.juneau.common.utils.Utils.*;
@@ -202,16 +203,16 @@ public class Mutaters {
                        };
                }
 
-               var ici = ClassInfo.of(ic);
-               var oci = ClassInfo.of(oc);
+       var ici = info(ic);
+       var oci = info(oc);
 
                ClassInfo pic = ici.getAllParents().stream().filter(x -> 
nn(m.get(x.inner()))).findFirst().orElse(null);
                if (nn(pic))
                        return m.get(pic.inner());
 
                if (ic == String.class) {
-                       Class<?> oc2 = oci.hasPrimitiveWrapper() ? 
oci.getPrimitiveWrapper() : oc;
-                       var oc2i = ClassInfo.of(oc2);
+               Class<?> oc2 = oci.hasPrimitiveWrapper() ? 
oci.getPrimitiveWrapper() : oc;
+               var oc2i = info(oc2);
 
                        // @formatter:off
                        final MethodInfo createMethod = oc2i.getPublicMethod(
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
index d0e5821990..1d7956818e 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.serializer;
 
 import static org.apache.juneau.collections.JsonMap.*;
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
 import static org.apache.juneau.common.utils.CollectionUtils.*;
 import static org.apache.juneau.common.utils.StringUtils.*;
 import static org.apache.juneau.common.utils.ThrowableUtils.*;
@@ -376,16 +377,16 @@ public class SerializerSession extends 
BeanTraverseSession {
                        if (cm.isArray() || (cm.isObject() && isArray(value))) {
                                if (((Object[])value).length == 0)
                                        return true;
-                       }
-                       if (cm.isCollection() || (cm.isObject() && 
ClassInfo.of(value).isChildOf(Collection.class))) {
-                               if (((Collection<?>)value).isEmpty())
+               }
+               if (cm.isCollection() || (cm.isObject() && 
info(value).isChildOf(Collection.class))) {
+                       if (((Collection<?>)value).isEmpty())
                                        return true;
                        }
                }
 
-               if (isTrimEmptyMaps()) {
-                       if (cm.isMap() || (cm.isObject() && 
ClassInfo.of(value).isChildOf(Map.class))) {
-                               if (((Map<?,?>)value).isEmpty())
+       if (isTrimEmptyMaps()) {
+               if (cm.isMap() || (cm.isObject() && 
info(value).isChildOf(Map.class))) {
+                       if (((Map<?,?>)value).isEmpty())
                                        return true;
                        }
                }
@@ -652,9 +653,9 @@ public class SerializerSession extends BeanTraverseSession {
        public final String toString(Object o) {
                if (o == null)
                        return null;
-               if (o.getClass() == Class.class)
-                       return ClassInfo.of((Class<?>)o).getNameFull();
-               if (o.getClass() == ClassInfo.class)
+       if (o.getClass() == Class.class)
+               return info((Class<?>)o).getNameFull();
+       if (o.getClass() == ClassInfo.class)
                        return ((ClassInfo)o).getNameFull();
                if (o.getClass().isEnum())
                        return getClassMetaForObject(o).toString(o);
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSet.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSet.java
index c5cf65201d..b7cfe73f3a 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSet.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSet.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.serializer;
 
 import static java.util.stream.Collectors.*;
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
 import static org.apache.juneau.common.utils.CollectionUtils.*;
 import static org.apache.juneau.common.utils.ThrowableUtils.*;
 import static org.apache.juneau.common.utils.Utils.*;
@@ -383,9 +384,9 @@ public class SerializerSet {
                private Object createBuilder(Object o) {
                        if (o instanceof Class) {
 
-                               // Check for no-arg constructor.
-                               ConstructorInfo ci = 
ClassInfo.of((Class<?>)o).getPublicConstructor(c -> c.getParameterCount() == 
0).orElse(null);
-                               if (nn(ci))
+                       // Check for no-arg constructor.
+                       ConstructorInfo ci = 
info((Class<?>)o).getPublicConstructor(c -> c.getParameterCount() == 
0).orElse(null);
+                       if (nn(ci))
                                        return ci.newInstance();
 
                                // Check for builder create method.
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 e79b332352..f131ea1812 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
@@ -16,6 +16,7 @@
  */
 package org.apache.juneau.svl;
 
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
 import static org.apache.juneau.common.utils.CollectionUtils.*;
 import static org.apache.juneau.common.utils.StateEnum.*;
 import static org.apache.juneau.common.utils.StringUtils.*;
@@ -265,9 +266,9 @@ public class VarResolverSession {
                if (o instanceof Set c) {
                        try {
                                if (! containsVars(c))
-                                       return o;
-                               Set c2 = 
ClassInfo.of(o).getDeclaredConstructor(x -> x.isPublic() && 
x.getParameterCount() == 0)
-                                       .map(ci -> safe(() -> 
(Set)ci.inner().newInstance()))
+                               return o;
+                       Set c2 = info(o).getDeclaredConstructor(x -> 
x.isPublic() && x.getParameterCount() == 0)
+                               .map(ci -> safe(() -> 
(Set)ci.inner().newInstance()))
                                        .orElseGet(LinkedHashSet::new);
                                Set c3 = c2;
                                c.forEach(x -> c3.add(resolve(x)));
@@ -281,9 +282,9 @@ public class VarResolverSession {
                if (o instanceof List c) {
                        try {
                                if (! containsVars(c))
-                                       return o;
-                               List c2 = 
ClassInfo.of(o).getDeclaredConstructor(x -> x.isPublic() && 
x.getParameterCount() == 0)
-                                       .map(ci -> safe(() -> 
(List)ci.inner().newInstance()))
+                               return o;
+                       List c2 = info(o).getDeclaredConstructor(x -> 
x.isPublic() && x.getParameterCount() == 0)
+                               .map(ci -> safe(() -> 
(List)ci.inner().newInstance()))
                                        .orElseGet(() -> list());
                                List c3 = c2;
                                c.forEach(x -> c3.add(resolve(x)));
@@ -297,9 +298,9 @@ public class VarResolverSession {
                if (o instanceof Map m) {
                        try {
                                if (! containsVars(m))
-                                       return o;
-                               Map m2 = 
ClassInfo.of(o).getDeclaredConstructor(x -> x.isPublic() && 
x.getParameterCount() == 0)
-                                       .map(ci -> safe(() -> 
(Map)ci.inner().newInstance()))
+                               return o;
+                       Map m2 = info(o).getDeclaredConstructor(x -> 
x.isPublic() && x.getParameterCount() == 0)
+                               .map(ci -> safe(() -> 
(Map)ci.inner().newInstance()))
                                        .orElseGet(LinkedHashMap::new);
                                Map m3 = m2;
                                m.forEach((k, v) -> m3.put(k, resolve(v)));
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/BuilderSwap.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/BuilderSwap.java
index 76ba5d2a6d..7aad1cdd2f 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/BuilderSwap.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/BuilderSwap.java
@@ -16,6 +16,7 @@
  */
 package org.apache.juneau.swap;
 
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
 import static org.apache.juneau.common.utils.ClassUtils.*;
 import static org.apache.juneau.common.utils.Utils.*;
 
@@ -50,11 +51,11 @@ public class BuilderSwap<T,B> {
         */
        @SuppressWarnings("rawtypes")
        public static BuilderSwap<?,?> findSwapFromBuilderClass(Class<?> 
builderClass, Visibility cVis, Visibility mVis) {
-               var bci = ClassInfo.of(builderClass);
+               var bci = info(builderClass);
                if (bci.isNotPublic())
                        return null;
 
-               Class<?> objectClass = 
ClassInfo.of(builderClass).getParameterType(0, Builder.class);
+       Class<?> objectClass = info(builderClass).getParameterType(0, 
Builder.class);
 
                MethodInfo createObjectMethod, createBuilderMethod;
                ConstructorInfo objectConstructor;
@@ -64,13 +65,13 @@ public class BuilderSwap<T,B> {
                if (nn(createObjectMethod))
                        objectClass = 
createObjectMethod.getReturnType().inner();
 
-               if (objectClass == null)
-                       return null;
+       if (objectClass == null)
+               return null;
 
-               var pci = ClassInfo.of(objectClass);
+       var pci = info(objectClass);
 
-               objectConstructor = pci.getDeclaredConstructor(x -> 
x.isVisible(cVis) && x.hasParameterTypes(builderClass)).orElse(null);
-               if (objectConstructor == null)
+       objectConstructor = pci.getDeclaredConstructor(x -> x.isVisible(cVis) 
&& x.hasParameterTypes(builderClass)).orElse(null);
+       if (objectConstructor == null)
                        return null;
 
                builderConstructor = bci.getNoArgConstructor(cVis).orElse(null);
@@ -95,8 +96,8 @@ public class BuilderSwap<T,B> {
                var builderClass = Value.<Class<?>>empty();
                MethodInfo objectCreateMethod, builderCreateMethod;
                ConstructorInfo objectConstructor = null;
-               ConstructorInfo builderConstructor;
-               var pci = ClassInfo.of(objectClass);
+       ConstructorInfo builderConstructor;
+       var pci = info(objectClass);
 
                
bc.getAnnotationProvider().find(org.apache.juneau.annotation.Builder.class, 
pci).stream().map(x -> x.inner().value()).filter(x -> isNotVoid(x)).forEach(x 
-> builderClass.set(x));
 
@@ -122,8 +123,8 @@ public class BuilderSwap<T,B> {
                if (builderClass.isEmpty())
                        return null;
 
-               var bci = ClassInfo.of(builderClass.get());
-               builderConstructor = bci.getNoArgConstructor(cVis).orElse(null);
+       var bci = info(builderClass.get());
+       builderConstructor = bci.getNoArgConstructor(cVis).orElse(null);
                if (builderConstructor == null && builderCreateMethod == null)
                        return null;
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/ObjectSwap.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/ObjectSwap.java
index 0873bccade..73d7e9258f 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/ObjectSwap.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/ObjectSwap.java
@@ -16,6 +16,7 @@
  */
 package org.apache.juneau.swap;
 
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
 import static org.apache.juneau.common.utils.Utils.*;
 
 import java.util.*;
@@ -122,11 +123,11 @@ public abstract class ObjectSwap<T,S> {
         * Constructor.
         */
        protected ObjectSwap() {
-               var ci = ClassInfo.of(this.getClass());
+               var ci = info(this.getClass());
                normalClass = (Class<T>)ci.getParameterType(0, 
ObjectSwap.class);
                swapClass = ci.getParameterType(1, ObjectSwap.class);
-               normalClassInfo = ClassInfo.of(normalClass);
-               swapClassInfo = ClassInfo.of(swapClass);
+               normalClassInfo = info(normalClass);
+               swapClassInfo = info(swapClass);
                forMediaTypes = forMediaTypes();
                template = withTemplate();
        }
@@ -139,10 +140,10 @@ public abstract class ObjectSwap<T,S> {
         */
        protected ObjectSwap(Class<T> normalClass, Class<?> swapClass) {
                this.normalClass = normalClass;
-               this.swapClass = swapClass;
-               normalClassInfo = opt(normalClass).map(x -> 
ClassInfo.of(x)).orElse(null);
-               swapClassInfo = opt(swapClass).map(x -> 
ClassInfo.of(x)).orElse(null);
-               this.forMediaTypes = forMediaTypes();
+       this.swapClass = swapClass;
+       normalClassInfo = opt(normalClass).map(x -> info(x)).orElse(null);
+       swapClassInfo = opt(swapClass).map(x -> info(x)).orElse(null);
+       this.forMediaTypes = forMediaTypes();
                this.template = withTemplate();
        }
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/SurrogateSwap.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/SurrogateSwap.java
index 99aa7268d5..ad0d195d61 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/SurrogateSwap.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/SurrogateSwap.java
@@ -16,6 +16,7 @@
  */
 package org.apache.juneau.swap;
 
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
 import static org.apache.juneau.common.utils.Utils.*;
 
 import java.lang.reflect.*;
@@ -52,9 +53,9 @@ public class SurrogateSwap<T,F> extends ObjectSwap<T,F> {
         */
        @SuppressWarnings({ "unchecked", "rawtypes" })
        public static List<SurrogateSwap<?,?>> findObjectSwaps(Class<?> c, 
BeanContext bc) {
-               List<SurrogateSwap<?,?>> l = new LinkedList<>();
-               var ci = ClassInfo.of(c);
-               ci.getPublicConstructors().stream().filter(x -> ! 
bc.getAnnotationProvider().has(BeanIgnore.class, x) && x.hasNumParameters(1) && 
x.isPublic()).forEach(x -> {
+       List<SurrogateSwap<?,?>> l = new LinkedList<>();
+       var ci = info(c);
+       ci.getPublicConstructors().stream().filter(x -> ! 
bc.getAnnotationProvider().has(BeanIgnore.class, x) && x.hasNumParameters(1) && 
x.isPublic()).forEach(x -> {
                        var pt = x.getParameter(0).getParameterType().inner();
                        if (! pt.equals(c.getDeclaringClass())) {
                                // Find the unswap method if there is one.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swaps/TemporalSwap.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swaps/TemporalSwap.java
index b569e0ad72..f7bf621e0c 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swaps/TemporalSwap.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swaps/TemporalSwap.java
@@ -16,6 +16,7 @@
  */
 package org.apache.juneau.swaps;
 
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
 import static org.apache.juneau.common.utils.DateUtils.*;
 
 import java.lang.reflect.*;
@@ -338,9 +339,9 @@ public class TemporalSwap extends StringSwap<Temporal> {
        private static Method findParseMethod(Class<? extends Temporal> c) 
throws ExecutableException {
                Method m = FROM_METHODS.get(c);
                if (m == null) {
-                       // @formatter:off
-                       m = ClassInfo.of(c).getPublicMethod(
-                               x -> x.isStatic()
+               // @formatter:off
+               m = info(c).getPublicMethod(
+                       x -> x.isStatic()
                                && x.isNotDeprecated()
                                && x.hasName("from")
                                && x.hasReturnType(c)


Reply via email to