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

commit 1bc1f6762d254bd85b18f9202a86b37a13042f8a
Author: James Bognar <[email protected]>
AuthorDate: Tue Nov 18 11:51:17 2025 -0500

    org.apache.juneau.common.reflect API improvements
---
 .../juneau/common/reflect/AnnotationProvider.java  |  10 +-
 .../apache/juneau/common/reflect/ClassInfo.java    | 103 ++++----------------
 .../src/main/java/org/apache/juneau/BeanMeta.java  |  10 +-
 .../src/main/java/org/apache/juneau/ClassMeta.java |  27 +++---
 .../src/main/java/org/apache/juneau/Context.java   |   6 +-
 .../apache/juneau/cp/BeanCreateMethodFinder.java   |   9 +-
 .../java/org/apache/juneau/cp/BeanCreator.java     |  34 ++++---
 .../main/java/org/apache/juneau/cp/BeanStore.java  |  26 ++---
 .../java/org/apache/juneau/internal/Utils2.java    |   5 +-
 .../java/org/apache/juneau/parser/ParserSet.java   |   2 +-
 .../java/org/apache/juneau/reflect/Mutaters.java   |   8 +-
 .../apache/juneau/serializer/SerializerSet.java    |   2 +-
 .../org/apache/juneau/svl/VarResolverSession.java  |  30 ++----
 .../java/org/apache/juneau/swap/AutoListSwap.java  |   4 +-
 .../java/org/apache/juneau/swap/AutoMapSwap.java   |   4 +-
 .../org/apache/juneau/swap/AutoNumberSwap.java     |   6 +-
 .../org/apache/juneau/swap/AutoObjectSwap.java     |   4 +-
 .../java/org/apache/juneau/swap/BuilderSwap.java   |  14 +--
 .../java/org/apache/juneau/swap/SurrogateSwap.java |   5 +-
 .../java/org/apache/juneau/swaps/TemporalSwap.java |   9 +-
 .../apache/juneau/rest/client/ResponseContent.java |  24 ++---
 .../apache/juneau/rest/client/ResponseHeader.java  |   4 +-
 .../org/apache/juneau/rest/client/RestRequest.java |   8 +-
 .../java/org/apache/juneau/http/HttpParts.java     |   6 +-
 .../apache/juneau/http/header/HeaderBeanMeta.java  |  14 ++-
 .../org/apache/juneau/http/part/PartBeanMeta.java  |  14 ++-
 .../java/org/apache/juneau/rest/RestContext.java   |   4 +-
 .../juneau/common/reflect/ClassInfo_Test.java      |  48 ++++-----
 .../juneau/common/reflect/ConstructorInfoTest.java |   8 +-
 .../juneau/common/reflect/ExecutableInfo_Test.java | 108 ++++++++++-----------
 .../reflect/FieldInfo_AnnotationInfos_Test.java    |  12 +--
 .../common/reflect/FieldInfo_FullName_Test.java    |   8 +-
 .../juneau/common/reflect/FieldInfo_Test.java      |  28 +++---
 .../juneau/common/reflect/ParamInfoTest.java       |  30 +++---
 .../java/org/apache/juneau/cp/BeanStore_Test.java  |  14 +--
 .../org/apache/juneau/reflect/ParamInfoTest.java   |  30 +++---
 .../apache/juneau/rest/client/RestClient_Test.java |   6 +-
 37 files changed, 295 insertions(+), 389 deletions(-)

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 1372ab0619..16f83b4a47 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
@@ -334,21 +334,19 @@ public class AnnotationProvider {
                                try {
                                        var ci = ClassInfo.of(a.getClass());
 
-                                       MethodInfo mi = ci.getPublicMethod(x -> 
x.hasName("onClass"));
-                                       if (nn(mi)) {
+                                       ci.getPublicMethod(x -> 
x.hasName("onClass")).ifPresent(mi -> {
                                                if (! 
mi.getReturnType().is(Class[].class))
                                                        throw new 
BeanRuntimeException("Invalid annotation @{0} used in runtime annotations.  
Annotation must define an onClass() method that returns a Class array.", 
scn(a));
                                                for (var c : 
(Class<?>[])mi.accessible().invoke(a))
                                                        
runtimeAnnotations.append(c.getName(), a);
-                                       }
+                                       });
 
-                                       mi = ci.getPublicMethod(x -> 
x.hasName("on"));
-                                       if (nn(mi)) {
+                                       ci.getPublicMethod(x -> 
x.hasName("on")).ifPresent(mi -> {
                                                if (! 
mi.getReturnType().is(String[].class))
                                                        throw new 
BeanRuntimeException("Invalid annotation @{0} used in runtime annotations.  
Annotation must define an on() method that returns a String array.", scn(a));
                                                for (var s : 
(String[])mi.accessible().invoke(a))
                                                        
runtimeAnnotations.append(s, a);
-                                       }
+                                       });
 
                                } catch (BeanRuntimeException e) {
                                        throw e;
diff --git 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ClassInfo.java
 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ClassInfo.java
index b053678bce..ef226998d1 100644
--- 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ClassInfo.java
+++ 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ClassInfo.java
@@ -330,7 +330,7 @@ public class ClassInfo extends ElementInfo implements 
Annotatable {
         *              <jk>void</jk> method3() {}
         *              <jk>void</jk> method4() {}
         *      }
-        *      
+        *
         *      <jc>// getAllMethodsParentFirst() returns in parent-to-child 
order:</jc>
         *      ClassInfo <jv>ci</jv> = 
ClassInfo.<jsm>of</jsm>(Child.<jk>class</jk>);
         *      List&lt;MethodInfo&gt; <jv>methods</jv> = 
<jv>ci</jv>.getAllMethodsParentFirst();
@@ -453,11 +453,8 @@ public class ClassInfo extends ElementInfo implements 
Annotatable {
         * @param filter A predicate to apply to the entries to determine if 
value should be used.  Can be <jk>null</jk>.
         * @return The declared constructor that matches the specified 
predicate.
         */
-       public ConstructorInfo 
getDeclaredConstructor(Predicate<ConstructorInfo> filter) {
-               for (var ci : declaredConstructors.get())
-                       if (test(filter, ci))
-                               return ci;
-               return null;
+       public Optional<ConstructorInfo> 
getDeclaredConstructor(Predicate<ConstructorInfo> filter) {
+               return declaredConstructors.get().stream().filter(x -> 
test(filter, x)).findFirst();
        }
 
        /**
@@ -475,11 +472,8 @@ public class ClassInfo extends ElementInfo implements 
Annotatable {
         * @param filter A predicate to apply to the entries to determine if 
value should be used.  Can be <jk>null</jk>.
         * @return The declared field, or <jk>null</jk> if not found.
         */
-       public FieldInfo getDeclaredField(Predicate<FieldInfo> filter) {
-               for (var f : declaredFields.get())
-                       if (test(filter, f))
-                               return f;
-               return null;
+       public Optional<FieldInfo> getDeclaredField(Predicate<FieldInfo> 
filter) {
+               return declaredFields.get().stream().filter(x -> test(filter, 
x)).findFirst();
        }
 
        /**
@@ -625,11 +619,8 @@ public class ClassInfo extends ElementInfo implements 
Annotatable {
         * @param filter A predicate to apply to the entries to determine if 
value should be used.  Can be <jk>null</jk>.
         * @return The first matching method, or <jk>null</jk> if no methods 
matched.
         */
-       public MethodInfo getDeclaredMethod(Predicate<MethodInfo> filter) {
-               for (var mi : declaredMethods.get())
-                       if (test(filter, mi))
-                               return mi;
-               return null;
+       public Optional<MethodInfo> getDeclaredMethod(Predicate<MethodInfo> 
filter) {
+               return declaredMethods.get().stream().filter(x -> test(filter, 
x)).findFirst();
        }
 
        /**
@@ -797,58 +788,14 @@ public class ClassInfo extends ElementInfo implements 
Annotatable {
                        .map(a -> (AnnotationInfo<A>)a);
        }
 
-       /**
-        * Performs an action on all matching annotations on this class and 
parent classes/interfaces.
-        *
-        * <p>
-        * Annotations are consumed in the following order:
-        * <ol>
-        *      <li>On the package of this class.
-        *      <li>On interfaces ordered parent-to-child.
-        *      <li>On parent classes ordered parent-to-child.
-        *      <li>On this class.
-        * </ol>
-        *
-        * @param filter A predicate to apply to the entries to determine if 
action should be performed.  Can be <jk>null</jk>.
-        * @param action An action to perform on the entry.
-        * @return This object.
-        */
-       public ClassInfo forEachAnnotation(Predicate<AnnotationInfo<?>> filter, 
Consumer<AnnotationInfo<?>> action) {
-               var pi = getPackage();
-               if (nn(pi))
-                       for (var ai : pi.getAnnotations())
-                               if (filter == null || filter.test(ai))
-                                       action.accept(ai);
-               var interfaces = getInterfaces();
-               for (int i = interfaces.size() - 1; i >= 0; i--)
-                       for (var a : 
interfaces.get(i).inner().getDeclaredAnnotations())
-                               for (var a2 : splitRepeated(a)) {
-                                       var ai = 
AnnotationInfo.of(interfaces.get(i), a2);
-                                       if (filter == null || filter.test(ai))
-                                               action.accept(ai);
-                               }
-               var parents = getParents();
-               for (int i = parents.size() - 1; i >= 0; i--)
-                       for (var a : 
parents.get(i).inner().getDeclaredAnnotations())
-                               for (var a2 : splitRepeated(a)) {
-                                       var ai = 
AnnotationInfo.of(parents.get(i), a2);
-                                       if (filter == null || filter.test(ai))
-                                               action.accept(ai);
-                               }
-               return this;
-       }
-
        /**
         * Returns the first matching method on this class.
         *
         * @param filter A predicate to apply to the entries to determine if 
value should be used.  Can be <jk>null</jk>.
         * @return The first matching method, or <jk>null</jk> if no methods 
matched.
         */
-       public MethodInfo getMethod(Predicate<MethodInfo> filter) {
-               for (var mi : allMethods.get())
-                       if (test(filter, mi))
-                               return mi;
-               return null;
+       public Optional<MethodInfo> getMethod(Predicate<MethodInfo> filter) {
+               return allMethods.get().stream().filter(x -> test(filter, 
x)).findFirst();
        }
 
        /**
@@ -873,7 +820,7 @@ public class ClassInfo extends ElementInfo implements 
Annotatable {
         *              <jk>void</jk> method3() {}
         *              <jk>void</jk> method4() {}
         *      }
-        *      
+        *
         *      <jc>// getAllMethods() returns in child-to-parent order:</jc>
         *      ClassInfo <jv>ci</jv> = 
ClassInfo.<jsm>of</jsm>(Child.<jk>class</jk>);
         *      List&lt;MethodInfo&gt; <jv>methods</jv> = 
<jv>ci</jv>.getAllMethods();
@@ -1006,16 +953,15 @@ public class ClassInfo extends ElementInfo implements 
Annotatable {
         * @param v The minimum visibility.
         * @return The constructor, or <jk>null</jk> if no no-arg constructor 
exists with the required visibility.
         */
-       public ConstructorInfo getNoArgConstructor(Visibility v) {
+       public Optional<ConstructorInfo> getNoArgConstructor(Visibility v) {
                if (isAbstract())
-                       return null;
+                       return Optional.empty();
                int expectedParams = isNonStaticMemberClass() ? 1 : 0;
                return getDeclaredConstructors().stream()
                        .filter(cc -> cc.hasNumParameters(expectedParams))
                        .filter(cc -> cc.isVisible(v))
                        .map(cc -> cc.accessible(v))
-                       .findFirst()
-                       .orElse(null);
+                       .findFirst();
        }
 
        /**
@@ -1148,11 +1094,8 @@ public class ClassInfo extends ElementInfo implements 
Annotatable {
         * @param filter A predicate to apply to the entries to determine if 
value should be used.  Can be <jk>null</jk>.
         * @return The public constructor that matches the specified predicate.
         */
-       public ConstructorInfo getPublicConstructor(Predicate<ConstructorInfo> 
filter) {
-               for (var ci : publicConstructors.get())
-                       if (test(filter, ci))
-                               return ci;
-               return null;
+       public Optional<ConstructorInfo> 
getPublicConstructor(Predicate<ConstructorInfo> filter) {
+               return publicConstructors.get().stream().filter(x -> 
test(filter, x)).findFirst();
        }
 
        /**
@@ -1168,11 +1111,8 @@ public class ClassInfo extends ElementInfo implements 
Annotatable {
         * @param filter A predicate to apply to the entries to determine if 
value should be used.  Can be <jk>null</jk>.
         * @return The public field, or <jk>null</jk> if not found.
         */
-       public FieldInfo getPublicField(Predicate<FieldInfo> filter) {
-               for (var f : publicFields.get())
-                       if (test(filter, f))
-                               return f;
-               return null;
+       public Optional<FieldInfo> getPublicField(Predicate<FieldInfo> filter) {
+               return publicFields.get().stream().filter(x -> test(filter, 
x)).findFirst();
        }
 
        /**
@@ -1194,11 +1134,8 @@ public class ClassInfo extends ElementInfo implements 
Annotatable {
         * @param filter A predicate to apply to the entries to determine if 
value should be used.  Can be <jk>null</jk>.
         * @return The first matching method, or <jk>null</jk> if no methods 
matched.
         */
-       public MethodInfo getPublicMethod(Predicate<MethodInfo> filter) {
-               for (var mi : publicMethods.get())
-                       if (test(filter, mi))
-                               return mi;
-               return null;
+       public Optional<MethodInfo> getPublicMethod(Predicate<MethodInfo> 
filter) {
+               return publicMethods.get().stream().filter(x -> test(filter, 
x)).findFirst();
        }
 
        /**
@@ -1694,7 +1631,7 @@ public class ClassInfo extends ElementInfo implements 
Annotatable {
         * <p class='bjava'>
         *      ClassInfo <jv>intClass</jv> = 
ClassInfo.<jsm>of</jsm>(<jk>int</jk>.<jk>class</jk>);
         *      ClassInfo <jv>wrapper</jv> = 
<jv>intClass</jv>.getWrapperIfPrimitive();  <jc>// Returns ClassInfo for 
Integer.class</jc>
-        *      
+        *
         *      ClassInfo <jv>stringClass</jv> = 
ClassInfo.<jsm>of</jsm>(String.<jk>class</jk>);
         *      ClassInfo <jv>same</jv> = 
<jv>stringClass</jv>.getWrapperIfPrimitive();  <jc>// Returns same 
ClassInfo</jc>
         * </p>
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 69b7ef2b92..cb7bf99151 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
@@ -298,7 +298,7 @@ public class BeanMeta<T> {
                                        constructor = implClassConstructor;
 
                                if (constructor == null)
-                                       constructor = 
ci.getNoArgConstructor(hasBean ? Visibility.PRIVATE : conVis);
+                                       constructor = 
ci.getNoArgConstructor(hasBean ? Visibility.PRIVATE : conVis).orElse(null);
 
                                if (constructor == null && beanFilter == null 
&& ctx.isBeansRequireDefaultConstructor())
                                        return "Class does not have the 
required no-arg constructor";
@@ -706,16 +706,14 @@ public class BeanMeta<T> {
                Value<Field> value = Value.empty();
                forEachClass(ClassInfo.of(c), stopClass, c2 -> {
                        // @formatter:off
-                       FieldInfo f = c2.getDeclaredField(
+                       c2.getDeclaredField(
                                x -> x.isNotStatic()
                                && (x.isNotTransient() || noIgnoreTransients)
                                && (! x.hasAnnotation(Transient.class) || 
noIgnoreTransients)
                                && 
ctx.getAnnotationProvider().find(BeanIgnore.class, 
x.inner()).findAny().isEmpty()
-                               && x.hasName(name)
-                       );
+                               && x.hasName(name))
+                       .ifPresent(f -> value.set(f.inner()));
                        // @formatter:on
-                       if (nn(f))
-                               value.set(f.inner());
                });
                return value.get();
        }
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 ce9cdc1d07..77c40f056b 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
@@ -183,27 +183,25 @@ public class ClassMeta<T> implements Type {
                        // forName() is used by Class and Charset
                        String[] fromStringMethodNames = 
{"fromString","fromValue","valueOf","parse","parseString","forName","forString"};
                        // @formatter:off
-                       fromStringMethod = opt(
-                               ci.getPublicMethod(
+                       fromStringMethod = ci.getPublicMethod(
                                        x -> x.isStatic()
                                        && x.isNotDeprecated()
                                        && x.hasReturnType(c)
                                        && x.hasParameterTypes(String.class)
                                        && contains(x.getName(), 
fromStringMethodNames))
-                       ).map(MethodInfo::inner)
-                       .orElse(null);
+                               .map(x -> x.inner())
+                               .orElse(null);
                        // @formatter:on
 
                        // Find example() method if present.
                        // @formatter:off
-                       exampleMethod = opt(
-                               ci.getPublicMethod(
+                       exampleMethod = ci.getPublicMethod(
                                        x -> x.isStatic()
                                        && x.isNotDeprecated()
                                        && x.hasName("example")
                                        && 
x.hasParameterTypesLenient(BeanSession.class))
-                       ).map(MethodInfo::inner)
-                       .orElse(null);
+                               .map(x -> x.inner())
+                               .orElse(null);
                        // @formatter:on
 
                        ci.getAllFields().stream().filter(x -> 
bc.getAnnotationProvider().find(ParentProperty.class, 
x.inner()).findAny().isPresent()).forEach(x -> {
@@ -296,7 +294,7 @@ public class ClassMeta<T> implements Type {
 
                        if (innerClass != Object.class) {
                                ClassInfo x = implClass == null ? ci : 
ClassInfo.of(implClass);
-                               noArgConstructor = x.getPublicConstructor(cons 
-> cons.getParameterCount() == 0);
+                               noArgConstructor = x.getPublicConstructor(cons 
-> cons.getParameterCount() == 0).orElse(null);
                        }
 
                        try {
@@ -554,15 +552,14 @@ public class ClassMeta<T> implements Type {
                        return null;
                boolean isMemberClass = ci.isMemberClass() && ci.isNotStatic();
                // @formatter:off
-               ConstructorInfo cc = ci.getPublicConstructor(
+               return ci.getPublicConstructor(
                        x -> x.isVisible(v)
                        && x.isNotDeprecated()
                        && x.hasNumParameters(isMemberClass ? 1 : 0)
-               );
+               )
+               .map(cc -> (Constructor<? extends T>)v.transform(cc.inner()))
+               .orElse(null);
                // @formatter:on
-               if (nn(cc))
-                       return (Constructor<? extends 
T>)v.transform(cc.inner());
-               return null;
        }
 
        final Class<T> innerClass;                              // The class 
being wrapped.
@@ -1066,7 +1063,7 @@ public class ClassMeta<T> implements Type {
         */
        public ConstructorInfo getImplClassConstructor(Visibility conVis) {
                if (nn(implClass))
-                       return 
ClassInfo.of(implClass).getNoArgConstructor(conVis);
+                       return 
ClassInfo.of(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 2922d9ec87..9c59ef51ba 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
@@ -650,10 +650,8 @@ public abstract class Context {
                                cci = ClassInfo.of(type).getPublicConstructor(
                                        x -> x.hasNumParameters(1)
                                        && x.getParameter(0).canAccept(this)
-                               );
+                               ).orElseThrow(() -> runtimeException("Public 
constructor not found: {0}({1})", cn(type), cn(this)));
                                // @formatter:on
-                               if (cci == null)
-                                       throw runtimeException("Public 
constructor not found: {0}({1})", cn(type), cn(this));
                                CONTEXT_CONSTRUCTORS.put(type, cci);
                        }
                        return cci;
@@ -735,7 +733,7 @@ public abstract class Context {
                                                        && x.isNotDeprecated()
                                                        && x.hasName("create")
                                                        && 
x.hasReturnType(ci.getParameter(0).getParameterType())
-                                               );
+                                               ).orElse(null);
                                                // @formatter:on
                                                if (nn(mi))
                                                        break;
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 3f26b25d09..dc6e6a9554 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
@@ -145,16 +145,17 @@ public class BeanCreateMethodFinder<T> {
        public BeanCreateMethodFinder<T> find(Predicate<MethodInfo> filter) {
                // @formatter:off
                if (method == null) {
-                       method = ClassInfo.of(resourceClass).getPublicMethod(
+                       ClassInfo.of(resourceClass).getPublicMethod(
                                x -> x.isNotDeprecated()
                                && x.hasReturnType(beanType)
                                && ! x.hasAnnotation(BeanIgnore.class)
                                && filter.test(x)
                                && beanStore.hasAllParams(x)
                                && (x.isStatic() || nn(resource))
-                       );
-                       if (nn(method))
-                               args = beanStore.getParams(method);
+                       ).ifPresent(m -> {
+                               method = m;
+                               args = beanStore.getParams(m);
+                       });
                }
                return this;
                // @formatter:on
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 94fa1594e0..32c5459aab 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
@@ -249,7 +249,7 @@ public class BeanCreator<T> {
                // Look for getInstance(Builder).
                if (nn(builder)) {
                        // @formatter:off
-                       MethodInfo m = type.getPublicMethod(
+                       var result = type.getPublicMethod(
                                x -> x.isStatic()
                                && x.isNotDeprecated()
                                && x.hasNumParameters(1)
@@ -257,26 +257,26 @@ public class BeanCreator<T> {
                                && x.hasReturnType(type)
                                && ! x.hasAnnotation(BeanIgnore.class)
                                && x.hasName("getInstance")
-                       );
+                       ).map(m -> m.<T>invoke(null, builder));
                        // @formatter:on
-                       if (nn(m))
-                               return m.invoke(null, builder);
+                       if (result.isPresent())
+                               return result.get();
                }
 
                // Look for getInstance().
                if (builder == null) {
                        // @formatter:off
-                       MethodInfo m = type.getPublicMethod(
+                       var result = type.getPublicMethod(
                                x -> x.isStatic()
                                && x.isNotDeprecated()
                                && x.getParameterCount() == 0
                                && x.hasReturnType(type)
                                && ! x.hasAnnotation(BeanIgnore.class)
                                && x.hasName("getInstance")
-                       );
+                       ).map(m -> m.<T>invoke(null));
                        // @formatter:on
-                       if (nn(m))
-                               return m.invoke(null);
+                       if (result.isPresent())
+                               return result.get();
                }
 
                if (builder == null) {
@@ -331,14 +331,16 @@ public class BeanCreator<T> {
                if (builder == null) {
                        // Look for static-builder/protected-constructor pair.
                        Value<T> value = Value.empty();
-                       type.getDeclaredConstructors().stream().filter(x -> 
x.hasNumParameters(1) && x.isVisible(PROTECTED)).forEach(x -> {
-                               Class<?> pt = 
x.getParameter(0).getParameterType().inner();
-                               MethodInfo m = type.getPublicMethod(y -> 
isStaticCreateMethod(y, pt));
-                               if (nn(m)) {
-                                       Object builder = m.invoke(null);
-                                       
value.set(x.accessible().newInstance(builder));
-                               }
-                       });
+                       type.getDeclaredConstructors().stream()
+                               .filter(x -> x.hasNumParameters(1) && 
x.isVisible(PROTECTED))
+                               .forEach(x -> {
+                                       Class<?> pt = 
x.getParameter(0).getParameterType().inner();
+                                       type.getPublicMethod(y -> 
isStaticCreateMethod(y, pt))
+                                               .ifPresent(m -> {
+                                                       Object b = 
m.invoke(null);
+                                                       
value.set(x.accessible().newInstance(b));
+                                               });
+                               });
                        if (value.isPresent())
                                return value.get();
                }
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 e3b6da6ef2..ae614a0252 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
@@ -116,23 +116,25 @@ public class BeanStore {
                        var c = ClassInfo.of(type);
 
                        // @formatter:off
-                       MethodInfo m = c.getDeclaredMethod(
+                       Optional<BeanStore> result = c.getDeclaredMethod(
                                x -> x.isPublic()
                                && x.getParameterCount() == 0
                                && x.isStatic()
                                && x.hasName("getInstance")
-                       );
+                       ).map(m -> m.<BeanStore>invoke(null));
                        // @formatter:on
-                       if (nn(m))
-                               return m.invoke(null);
-
-                       ConstructorInfo ci = c.getPublicConstructor(x -> 
x.canAccept(this));
-                       if (nn(ci))
-                               return ci.newInstance(this);
-
-                       ci = c.getDeclaredConstructor(x -> x.isProtected() && 
x.canAccept(this));
-                       if (nn(ci))
-                               return ci.accessible().newInstance(this);
+                       if (result.isPresent())
+                               return result.get();
+
+                       result = c.getPublicConstructor(x -> x.canAccept(this))
+                               .map(ci -> ci.<BeanStore>newInstance(this));
+                       if (result.isPresent())
+                               return result.get();
+
+                       result = c.getDeclaredConstructor(x -> x.isProtected() 
&& x.canAccept(this))
+                               .map(ci -> 
ci.accessible().<BeanStore>newInstance(this));
+                       if (result.isPresent())
+                               return result.get();
 
                        throw runtimeException("Could not find a way to 
instantiate class {0}", cn(type));
                }
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 9d034868d5..3232a14ebe 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
@@ -48,9 +48,8 @@ public class Utils2 extends Utils {
                        var methods2 = new LinkedHashMap<String,MethodInfo>();
                        do {
                                String cname = ci.getNameShort();
-                               MethodInfo mi = ci.getDeclaredMethod(x -> 
x.hasName("properties"));
-                               if (nn(mi))
-                                       methods2.put(cname, mi.accessible());
+                               ci.getDeclaredMethod(x -> 
x.hasName("properties"))
+                                       .ifPresent(mi -> methods2.put(cname, 
mi.accessible()));
                                ci = ci.getSuperclass();
                        } while (nn(ci));
                        methods = methods2;
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 5001ae535d..d89c4bcbc7 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
@@ -388,7 +388,7 @@ public class ParserSet {
                        if (o instanceof Class) {
 
                                // Check for no-arg constructor.
-                               ConstructorInfo ci = 
ClassInfo.of((Class<?>)o).getPublicConstructor(c -> c.getParameterCount() == 0);
+                               ConstructorInfo ci = 
ClassInfo.of((Class<?>)o).getPublicConstructor(c -> c.getParameterCount() == 
0).orElse(null);
                                if (nn(ci))
                                        return ci.newInstance();
 
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 f00046fd6f..d6706fc508 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
@@ -220,7 +220,7 @@ public class Mutaters {
                                && x.hasReturnType(oc2)
                                && x.hasParameterTypes(ic)
                                && (x.hasName("forName") || 
isStaticCreateMethodName(x, ic))
-                       );
+                       ).orElse(null);
                        // @formatter:on
 
                        if (oc2.isEnum() && createMethod == null) {
@@ -252,7 +252,7 @@ public class Mutaters {
                                && x.hasReturnType(oc)
                                && x.hasParameterTypes(ic)
                                && isStaticCreateMethodName(x, ic)
-                       );
+                       ).orElse(null);
                        // @formatter:on
 
                        if (nn(createMethod)) {
@@ -270,7 +270,7 @@ public class Mutaters {
                        }
                }
 
-               ConstructorInfo c = oci.getPublicConstructor(x -> 
x.hasParameterTypes(ic));
+               ConstructorInfo c = oci.getPublicConstructor(x -> 
x.hasParameterTypes(ic)).orElse(null);
                if (nn(c) && c.isNotDeprecated()) {
                        boolean isMemberClass = oci.isNonStaticMemberClass();
                        return new Mutater() {
@@ -312,7 +312,7 @@ public class Mutaters {
                        && x.getParameterCount() == 0
                        && x.getSimpleName().startsWith("to")
                        && x.getSimpleName().substring(2).equalsIgnoreCase(tn)
-               );
+               ).orElse(null);
                // @formatter:on
        }
 
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 8cba57202d..743c83638b 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
@@ -384,7 +384,7 @@ public class SerializerSet {
                        if (o instanceof Class) {
 
                                // Check for no-arg constructor.
-                               ConstructorInfo ci = 
ClassInfo.of((Class<?>)o).getPublicConstructor(c -> c.getParameterCount() == 0);
+                               ConstructorInfo ci = 
ClassInfo.of((Class<?>)o).getPublicConstructor(c -> c.getParameterCount() == 
0).orElse(null);
                                if (nn(ci))
                                        return ci.newInstance();
 
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 511e2d0cf4..d5d2cea352 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
@@ -266,13 +266,9 @@ public class VarResolverSession {
                        try {
                                if (! containsVars(c))
                                        return o;
-                               Set c2 = null;
-                               var ci = 
ClassInfo.of(o).getDeclaredConstructor(x -> x.isPublic() && 
x.getParameterCount() == 0);
-                               if (ci != null) {
-                                       c2 = (Set)ci.inner().newInstance();
-                               } else {
-                                       c2 = new LinkedHashSet<>();
-                               }
+                               Set c2 = 
ClassInfo.of(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)));
                                return (T)c2;
@@ -286,13 +282,9 @@ public class VarResolverSession {
                        try {
                                if (! containsVars(c))
                                        return o;
-                               List c2 = null;
-                               var ci = 
ClassInfo.of(o).getDeclaredConstructor(x -> x.isPublic() && 
x.getParameterCount() == 0);
-                               if (ci != null) {
-                                       c2 = (List)ci.inner().newInstance();
-                               } else {
-                                       c2 = list();
-                               }
+                               List c2 = 
ClassInfo.of(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)));
                                return (T)c2;
@@ -306,13 +298,9 @@ public class VarResolverSession {
                        try {
                                if (! containsVars(m))
                                        return o;
-                               Map m2 = null;
-                               var ci = 
ClassInfo.of(o).getDeclaredConstructor(x -> x.isPublic() && 
x.getParameterCount() == 0);
-                               if (ci != null) {
-                                       m2 = (Map)ci.inner().newInstance();
-                               } else {
-                                       m2 = new LinkedHashMap<>();
-                               }
+                               Map m2 = 
ClassInfo.of(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)));
                                return (T)m2;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoListSwap.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoListSwap.java
index e999dd0f8f..928792cfa5 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoListSwap.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoListSwap.java
@@ -109,11 +109,11 @@ public class AutoListSwap<T> extends 
ObjectSwap<T,List<?>> {
 
                                var rt = m.getReturnType();
 
-                               var mi = ci.getMethod(x -> isUnswapMethod(bc, 
x, ci, rt));
+                               var mi = ci.getMethod(x -> isUnswapMethod(bc, 
x, ci, rt)).orElse(null);
                                if (nn(mi))
                                        return new AutoListSwap(bc, ci, m, mi, 
null);
 
-                               var cs = ci.getDeclaredConstructor(x -> 
isUnswapConstructor(bc, x, rt));
+                               var cs = ci.getDeclaredConstructor(x -> 
isUnswapConstructor(bc, x, rt)).orElse(null);
                                if (nn(cs))
                                        return new AutoListSwap(bc, ci, m, 
null, cs);
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoMapSwap.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoMapSwap.java
index 00b4390678..871a648dde 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoMapSwap.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoMapSwap.java
@@ -109,11 +109,11 @@ public class AutoMapSwap<T> extends 
ObjectSwap<T,Map<?,?>> {
 
                                var rt = m.getReturnType();
 
-                               var mi = ci.getMethod(x -> isUnswapMethod(bc, 
x, ci, rt));
+                               var mi = ci.getMethod(x -> isUnswapMethod(bc, 
x, ci, rt)).orElse(null);
                                if (nn(mi))
                                        return new AutoMapSwap(bc, ci, m, mi, 
null);
 
-                               var cs = ci.getDeclaredConstructor(x -> 
isUnswapConstructor(bc, x, rt));
+                               var cs = ci.getDeclaredConstructor(x -> 
isUnswapConstructor(bc, x, rt)).orElse(null);
                                if (nn(cs))
                                        return new AutoMapSwap(bc, ci, m, null, 
cs);
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoNumberSwap.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoNumberSwap.java
index fdc1206db7..45bfdb0345 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoNumberSwap.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoNumberSwap.java
@@ -131,13 +131,13 @@ public class AutoNumberSwap<T> extends 
ObjectSwap<T,Number> {
 
                if (isSwapMethod(bc, m)) {
 
-                               ClassInfo rt = m.getReturnType();
+                               var rt = m.getReturnType();
 
-                               MethodInfo mi = ci.getMethod(x -> 
isUnswapMethod(bc, x, ci, rt));
+                               var mi = ci.getMethod(x -> isUnswapMethod(bc, 
x, ci, rt)).orElse(null);
                                if (nn(mi))
                                        return new AutoNumberSwap(bc, ci, m, 
mi, null);
 
-                               ConstructorInfo cs = 
ci.getDeclaredConstructor(x -> isUnswapConstructor(bc, x, rt));
+                               var cs = ci.getDeclaredConstructor(x -> 
isUnswapConstructor(bc, x, rt)).orElse(null);
                                if (nn(cs))
                                        return new AutoNumberSwap(bc, ci, m, 
null, cs);
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoObjectSwap.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoObjectSwap.java
index e5c9ee0859..53af77d0e2 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoObjectSwap.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoObjectSwap.java
@@ -111,11 +111,11 @@ public class AutoObjectSwap<T> extends 
ObjectSwap<T,Object> {
 
                                ClassInfo rt = m.getReturnType();
 
-                               MethodInfo mi = ci.getMethod(x -> 
isUnswapMethod(bc, x, ci, rt));
+                               MethodInfo mi = ci.getMethod(x -> 
isUnswapMethod(bc, x, ci, rt)).orElse(null);
                                if (nn(mi))
                                        return new AutoObjectSwap(bc, ci, m, 
mi, null);
 
-                               ConstructorInfo cs = 
ci.getDeclaredConstructor(x -> isUnswapConstructor(bc, x, rt));
+                               ConstructorInfo cs = 
ci.getDeclaredConstructor(x -> isUnswapConstructor(bc, x, rt)).orElse(null);
                                if (nn(cs))
                                        return new AutoObjectSwap(bc, ci, m, 
null, cs);
 
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 25fc1ea0a8..93b4e1f45d 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
@@ -69,11 +69,11 @@ public class BuilderSwap<T,B> {
 
                var pci = ClassInfo.of(objectClass);
 
-               objectConstructor = pci.getDeclaredConstructor(x -> 
x.isVisible(cVis) && x.hasParameterTypes(builderClass));
+               objectConstructor = pci.getDeclaredConstructor(x -> 
x.isVisible(cVis) && x.hasParameterTypes(builderClass)).orElse(null);
                if (objectConstructor == null)
                        return null;
 
-               builderConstructor = bci.getNoArgConstructor(cVis);
+               builderConstructor = bci.getNoArgConstructor(cVis).orElse(null);
                createBuilderMethod = getBuilderCreateMethod(pci);
                if (builderConstructor == null && createBuilderMethod == null)
                        return null;
@@ -112,7 +112,7 @@ public class BuilderSwap<T,B> {
                                x -> x.isVisible(cVis)
                                && x.hasNumParameters(1)
                                && 
x.getParameter(0).getParameterType().isChildOf(Builder.class)
-                       );
+                       ).orElse(null);
                        // @formatter:on
                        if (nn(cc)) {
                                objectConstructor = cc;
@@ -124,14 +124,14 @@ public class BuilderSwap<T,B> {
                        return null;
 
                var bci = ClassInfo.of(builderClass.get());
-               builderConstructor = bci.getNoArgConstructor(cVis);
+               builderConstructor = bci.getNoArgConstructor(cVis).orElse(null);
                if (builderConstructor == null && builderCreateMethod == null)
                        return null;
 
                objectCreateMethod = getBuilderBuildMethod(bci);
                var builderClass2 = builderClass.get();
                if (objectConstructor == null)
-                       objectConstructor = pci.getDeclaredConstructor(x -> 
x.isVisible(cVis) && x.hasParameterTypes(builderClass2));
+                       objectConstructor = pci.getDeclaredConstructor(x -> 
x.isVisible(cVis) && x.hasParameterTypes(builderClass2)).orElse(null);
 
                if (objectConstructor == null && objectCreateMethod == null)
                        return null;
@@ -147,7 +147,7 @@ public class BuilderSwap<T,B> {
                        && x.getParameterCount() == 0
                        && (!x.hasReturnType(void.class))
                        && x.hasName("build")
-               );
+               ).orElse(null);
                // @formatter:on
        }
 
@@ -158,7 +158,7 @@ public class BuilderSwap<T,B> {
                        && (x.hasName("create") || x.hasName("builder"))
                        && ! x.hasReturnType(c)
                        && hasConstructorThatTakesType(c, x.getReturnType())
-               );
+               ).orElse(null);
                // @formatter:on
        }
 
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 623d5856a7..e7b0cc4a0c 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
@@ -58,8 +58,9 @@ public class SurrogateSwap<T,F> extends ObjectSwap<T,F> {
                        var pt = x.getParameter(0).getParameterType().inner();
                        if (! pt.equals(c.getDeclaringClass())) {
                                // Find the unswap method if there is one.
-                               var mi = ci.getPublicMethod(y -> 
y.hasReturnType(pt));
-                               Method unswapMethod = nn(mi) ? mi.inner() : 
null;
+                               Method unswapMethod = ci.getPublicMethod(y -> 
y.hasReturnType(pt))
+                                       .map(MethodInfo::inner)
+                                       .orElse(null);
                                l.add(new SurrogateSwap(pt, x.inner(), 
unswapMethod));
                        }
                });
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 ab56dc2c7b..b569e0ad72 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
@@ -339,17 +339,16 @@ public class TemporalSwap extends StringSwap<Temporal> {
                Method m = FROM_METHODS.get(c);
                if (m == null) {
                        // @formatter:off
-                       MethodInfo mi = ClassInfo.of(c).getPublicMethod(
+                       m = ClassInfo.of(c).getPublicMethod(
                                x -> x.isStatic()
                                && x.isNotDeprecated()
                                && x.hasName("from")
                                && x.hasReturnType(c)
                                && x.hasParameterTypes(TemporalAccessor.class)
-                       );
+                       )
+                       .map(MethodInfo::inner)
+                       .orElseThrow(() -> new ExecutableException("Parse 
method not found on temporal class ''{0}''", c.getSimpleName()));
                        // @formatter:on
-                       if (mi == null)
-                               throw new ExecutableException("Parse method not 
found on temporal class ''{0}''", c.getSimpleName());
-                       m = mi.inner();
                        FROM_METHODS.put(c, m);
                }
                return m;
diff --git 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/ResponseContent.java
 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/ResponseContent.java
index e465751880..c1a8b96ae9 100644
--- 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/ResponseContent.java
+++ 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/ResponseContent.java
@@ -233,14 +233,10 @@ public class ResponseContent implements HttpEntity {
                        if (type.is(HttpResource.class))
                                type = 
(ClassMeta<T>)getClassMeta(BasicResource.class);
 
-                       ConstructorInfo ci = 
type.getInfo().getPublicConstructor(x -> 
x.hasParameterTypes(HttpResponse.class));
-                       if (nn(ci)) {
-                               try {
-                                       return (T)ci.newInstance(response);
-                               } catch (ExecutableException e) {
-                                       throw toRuntimeException(e);
-                               }
-                       }
+                       var result = type.getInfo().getPublicConstructor(x -> 
x.hasParameterTypes(HttpResponse.class))
+                               .map(ci -> safe(() -> 
(T)ci.newInstance(response)));
+                       if (result.isPresent())
+                               return result.get();
 
                        var ct = 
firstNonEmpty(response.getHeader("Content-Type").orElse("text/plain"));
 
@@ -270,14 +266,10 @@ public class ResponseContent implements HttpEntity {
 
                                        // Some HTTP responses have no body, so 
try to create these beans if they've got no-arg constructors.
                                        if (t == null && ! 
type.is(String.class)) {
-                                               ConstructorInfo c = 
type.getInfo().getPublicConstructor(cons -> cons.getParameterCount() == 0);
-                                               if (nn(c)) {
-                                                       try {
-                                                               return 
c.<T>newInstance();
-                                                       } catch 
(ExecutableException e) {
-                                                               throw new 
ParseException(e);
-                                                       }
-                                               }
+                                               var result2 = 
type.getInfo().getPublicConstructor(cons -> cons.getParameterCount() == 0)
+                                                       .map(c -> safe(() -> 
c.<T>newInstance()));
+                                               if (result2.isPresent())
+                                                       return result2.get();
                                        }
 
                                        return t;
diff --git 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/ResponseHeader.java
 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/ResponseHeader.java
index e90c3181cd..f8d21f5efe 100644
--- 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/ResponseHeader.java
+++ 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/ResponseHeader.java
@@ -252,10 +252,10 @@ public class ResponseHeader extends BasicHeader {
        public <T extends BasicHeader> T asHeader(Class<T> c) {
                try {
                        var ci = ClassInfo.of(c);
-                       ConstructorInfo cc = ci.getPublicConstructor(x -> 
x.hasParameterTypes(String.class));
+                       ConstructorInfo cc = ci.getPublicConstructor(x -> 
x.hasParameterTypes(String.class)).orElse(null);
                        if (nn(cc))
                                return cc.newInstance(getValue());
-                       cc = ci.getPublicConstructor(x -> 
x.hasParameterTypes(String.class, String.class));
+                       cc = ci.getPublicConstructor(x -> 
x.hasParameterTypes(String.class, String.class)).orElse(null);
                        if (nn(cc))
                                return cc.newInstance(getName(), getValue());
                } catch (Throwable e) {
diff --git 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestRequest.java
 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestRequest.java
index c62e44512a..02c3f997a4 100644
--- 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestRequest.java
+++ 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestRequest.java
@@ -1943,16 +1943,16 @@ public class RestRequest extends BeanSession implements 
HttpUriRequest, Configur
                                        if (t.getName().equals(className)) {
                                                ConstructorInfo c = null;
                                                var ci = ClassInfo.of(t);
-                                               c = ci.getPublicConstructor(x 
-> x.hasParameterTypes(HttpResponse.class));
+                                               c = ci.getPublicConstructor(x 
-> x.hasParameterTypes(HttpResponse.class)).orElse(null);
                                                if (nn(c))
                                                        throw 
c.<Throwable>newInstance(response);
-                                               c = ci.getPublicConstructor(x 
-> x.hasParameterTypes(String.class));
+                                               c = ci.getPublicConstructor(x 
-> x.hasParameterTypes(String.class)).orElse(null);
                                                if (nn(c))
                                                        throw 
c.<Throwable>newInstance(nn(message) ? message : 
response.getContent().asString());
-                                               c = ci.getPublicConstructor(x 
-> x.hasParameterTypes(String.class, Throwable.class));
+                                               c = ci.getPublicConstructor(x 
-> x.hasParameterTypes(String.class, Throwable.class)).orElse(null);
                                                if (nn(c))
                                                        throw 
c.<Throwable>newInstance(nn(message) ? message : 
response.getContent().asString(), null);
-                                               c = 
ci.getPublicConstructor(cons -> cons.getParameterCount() == 0);
+                                               c = 
ci.getPublicConstructor(cons -> cons.getParameterCount() == 0).orElse(null);
                                                if (nn(c))
                                                        throw 
c.<Throwable>newInstance();
                                        }
diff --git 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/HttpParts.java
 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/HttpParts.java
index e628bc0933..12faa313ad 100644
--- 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/HttpParts.java
+++ 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/HttpParts.java
@@ -71,10 +71,8 @@ public class HttpParts {
 
        private static final Function<ClassMeta<?>,ConstructorInfo> 
CONSTRUCTOR_FUNCTION = x -> {
                var ci = x.getInfo();
-               var cc = ci.getPublicConstructor(y -> 
y.hasParameterTypes(String.class));
-               if (cc == null)
-                       cc = ci.getPublicConstructor(y -> 
y.hasParameterTypes(String.class, String.class));
-               return cc;
+               return ci.getPublicConstructor(y -> 
y.hasParameterTypes(String.class))
+                       .orElseGet(() -> ci.getPublicConstructor(y -> 
y.hasParameterTypes(String.class, String.class)).orElse(null));
        };
 
        /**
diff --git 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/HeaderBeanMeta.java
 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/HeaderBeanMeta.java
index 2bca093c83..1ba89584f1 100644
--- 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/HeaderBeanMeta.java
+++ 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/HeaderBeanMeta.java
@@ -95,14 +95,12 @@ public class HeaderBeanMeta<T> {
 
                var ci = ClassInfo.of(type);
 
-               ConstructorInfo cci = ci.getPublicConstructor(x -> 
x.hasParameterTypes(String.class));
-               if (cci == null)
-                       cci = ci.getPublicConstructor(x -> 
x.hasParameterTypes(Object.class));
-               if (cci == null)
-                       cci = ci.getPublicConstructor(x -> 
x.hasParameterTypes(String.class, String.class));
-               if (cci == null)
-                       cci = ci.getPublicConstructor(x -> 
x.hasParameterTypes(String.class, Object.class));
-               constructor = cci == null ? null : cci.inner();
+               constructor = ci.getPublicConstructor(x -> 
x.hasParameterTypes(String.class))
+                       .or(() -> ci.getPublicConstructor(x -> 
x.hasParameterTypes(Object.class)))
+                       .or(() -> ci.getPublicConstructor(x -> 
x.hasParameterTypes(String.class, String.class)))
+                       .or(() -> ci.getPublicConstructor(x -> 
x.hasParameterTypes(String.class, Object.class)))
+                       .map(x -> x.<T>inner())
+                       .orElse(null);
 
                this.schema = 
HttpPartSchema.create(org.apache.juneau.http.annotation.Header.class, type);
        }
diff --git 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/part/PartBeanMeta.java
 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/part/PartBeanMeta.java
index 3fc2b2c841..e610b8d7a2 100644
--- 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/part/PartBeanMeta.java
+++ 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/part/PartBeanMeta.java
@@ -96,14 +96,12 @@ public class PartBeanMeta<T> {
 
                var ci = ClassInfo.of(type);
 
-               ConstructorInfo cci = ci.getPublicConstructor(x -> 
x.hasParameterTypes(String.class));
-               if (cci == null)
-                       cci = ci.getPublicConstructor(x -> 
x.hasParameterTypes(Object.class));
-               if (cci == null)
-                       cci = ci.getPublicConstructor(x -> 
x.hasParameterTypes(String.class, String.class));
-               if (cci == null)
-                       cci = ci.getPublicConstructor(x -> 
x.hasParameterTypes(String.class, Object.class));
-               constructor = cci == null ? null : cci.inner();
+               constructor = ci.getPublicConstructor(x -> 
x.hasParameterTypes(String.class))
+                       .or(() -> ci.getPublicConstructor(x -> 
x.hasParameterTypes(Object.class)))
+                       .or(() -> ci.getPublicConstructor(x -> 
x.hasParameterTypes(String.class, String.class)))
+                       .or(() -> ci.getPublicConstructor(x -> 
x.hasParameterTypes(String.class, Object.class)))
+                       .map(x -> x.<T>inner())
+                       .orElse(null);
 
                if (ci.hasAnnotation(Query.class))
                        this.schema = HttpPartSchema.create(Query.class, type);
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
index 036037cdc2..cb8631a7e9 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
@@ -4496,7 +4496,7 @@ public class RestContext extends Context {
 
                                RestContext cc = cb.init(so).build();
 
-                               MethodInfo mi = 
ClassInfo.of(so.get()).getMethod(x -> x.hasName("setContext") && 
x.hasParameterTypes(RestContext.class));
+                               MethodInfo mi = 
ClassInfo.of(so.get()).getMethod(x -> x.hasName("setContext") && 
x.hasParameterTypes(RestContext.class)).orElse(null);
                                if (nn(mi))
                                        mi.accessible().invoke(so.get(), cc);
 
@@ -5765,7 +5765,7 @@ public class RestContext extends Context {
                if (initialized.get())
                        return this;
                var resource = getResource();
-               var mi = ClassInfo.of(getResource()).getPublicMethod(x -> 
x.hasName("setContext") && x.hasParameterTypes(RestContext.class));
+               var mi = ClassInfo.of(getResource()).getPublicMethod(x -> 
x.hasName("setContext") && x.hasParameterTypes(RestContext.class)).orElse(null);
                if (nn(mi)) {
                        try {
                                mi.accessible().invoke(resource, this);
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ClassInfo_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ClassInfo_Test.java
index effef821a8..d01674f5fa 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ClassInfo_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ClassInfo_Test.java
@@ -180,10 +180,10 @@ public class ClassInfo_Test extends TestBase {
        }
 
        @Test void resolvedParams() {
-               var mi2 = ClassInfo.of(A6.class).getPublicMethod(x -> 
x.hasName("m1"));
+               var mi2 = ClassInfo.of(A6.class).getPublicMethod(x -> 
x.hasName("m1")).get();
                check("A1", 
mi2.getParameter(0).getParameterType().unwrap(Optional.class));
                check("A1", mi2.getReturnType().unwrap(Optional.class));
-               mi2 = ClassInfo.of(A6.class).getPublicMethod(x -> 
x.hasName("m2"));
+               mi2 = ClassInfo.of(A6.class).getPublicMethod(x -> 
x.hasName("m2")).get();
                check("A1", 
mi2.getParameter(0).getParameterType().unwrap(Value.class));
                check("A1", mi2.getReturnType().unwrap(Value.class));
        }
@@ -411,43 +411,43 @@ public class ClassInfo_Test extends TestBase {
        }
 
        @Test void getPublicConstructor_classArgs() {
-               check("E1(String)", e1.getPublicConstructor(x -> 
x.hasParameterTypes(String.class)));
+               check("E1(String)", e1.getPublicConstructor(x -> 
x.hasParameterTypes(String.class)).orElse(null));
        }
 
        @Test void getPublicConstructor_objectArgs() {
-               check("E1(String)", e1.getPublicConstructor(x -> 
x.canAccept("foo")));
+               check("E1(String)", e1.getPublicConstructor(x -> 
x.canAccept("foo")).orElse(null));
        }
 
        @Test void getNoArgConstructor() {
-               check("E2()", e2.getNoArgConstructor(Visibility.PRIVATE));
-               check("E2()", e2.getNoArgConstructor(Visibility.PROTECTED));
-               check("E2()", e2.getNoArgConstructor(Visibility.DEFAULT));
-               check(null, e2.getNoArgConstructor(Visibility.PUBLIC));
+               check("E2()", 
e2.getNoArgConstructor(Visibility.PRIVATE).orElse(null));
+               check("E2()", 
e2.getNoArgConstructor(Visibility.PROTECTED).orElse(null));
+               check("E2()", 
e2.getNoArgConstructor(Visibility.DEFAULT).orElse(null));
+               check(null, 
e2.getNoArgConstructor(Visibility.PUBLIC).orElse(null));
        }
 
        @Test void getNoArgConstructor_abstractClass() {
-               check(null, e3.getNoArgConstructor(Visibility.PUBLIC));
+               check(null, 
e3.getNoArgConstructor(Visibility.PUBLIC).orElse(null));
        }
 
        @Test void getNoArgConstructor_innerClass() {
-               check("E4(ClassInfo_Test)", 
e4.getNoArgConstructor(Visibility.PUBLIC));
+               check("E4(ClassInfo_Test)", 
e4.getNoArgConstructor(Visibility.PUBLIC).orElse(null));
        }
 
        @Test void getNoArgConstructor_noConstructor() {
-               check(null, e6.getNoArgConstructor(Visibility.PUBLIC));
+               check(null, 
e6.getNoArgConstructor(Visibility.PUBLIC).orElse(null));
        }
 
        @Test void getPublicNoArgConstructor() {
-               check("E1()", e1.getPublicConstructor(cons -> 
cons.getParameterCount() == 0));
+               check("E1()", e1.getPublicConstructor(cons -> 
cons.getParameterCount() == 0).orElse(null));
        }
 
        @Test void getConstructor() {
-               check("E1(int)", e1.getDeclaredConstructor(x -> 
x.isVisible(Visibility.PROTECTED) && x.hasParameterTypes(int.class)));
-               check("E1(int)", e1.getDeclaredConstructor(x -> 
x.isVisible(Visibility.PRIVATE) && x.hasParameterTypes(int.class)));
-               check(null, e1.getDeclaredConstructor(x -> 
x.isVisible(Visibility.PUBLIC) && x.hasParameterTypes(int.class)));
-               check("E3()", e3.getDeclaredConstructor(x -> 
x.isVisible(Visibility.PUBLIC)));
-               check("E4(ClassInfo_Test)", e4.getDeclaredConstructor(x -> 
x.isVisible(Visibility.PUBLIC)));
-               check("E5()", e5.getDeclaredConstructor(x -> 
x.isVisible(Visibility.PUBLIC)));
+               check("E1(int)", e1.getDeclaredConstructor(x -> 
x.isVisible(Visibility.PROTECTED) && 
x.hasParameterTypes(int.class)).orElse(null));
+               check("E1(int)", e1.getDeclaredConstructor(x -> 
x.isVisible(Visibility.PRIVATE) && 
x.hasParameterTypes(int.class)).orElse(null));
+               check(null, e1.getDeclaredConstructor(x -> 
x.isVisible(Visibility.PUBLIC) && x.hasParameterTypes(int.class)).orElse(null));
+               check("E3()", e3.getDeclaredConstructor(x -> 
x.isVisible(Visibility.PUBLIC)).orElse(null));
+               check("E4(ClassInfo_Test)", e4.getDeclaredConstructor(x -> 
x.isVisible(Visibility.PUBLIC)).orElse(null));
+               check("E5()", e5.getDeclaredConstructor(x -> 
x.isVisible(Visibility.PUBLIC)).orElse(null));
        }
 
        
//-----------------------------------------------------------------------------------------------------------------
@@ -512,15 +512,15 @@ public class ClassInfo_Test extends TestBase {
        static ClassInfo f3=of(F3.class);
 
        @Test void getPublicField() {
-               check("F3.a1", f3.getPublicField(x -> x.hasName("a1")));
-               check(null, f3.getPublicField(x -> x.hasName("a2")));
-               check(null, f3.getPublicField(x -> x.hasName("a3")));
+               check("F3.a1", f3.getPublicField(x -> 
x.hasName("a1")).orElse(null));
+               check(null, f3.getPublicField(x -> 
x.hasName("a2")).orElse(null));
+               check(null, f3.getPublicField(x -> 
x.hasName("a3")).orElse(null));
        }
 
        @Test void getDeclaredField() {
-               check("F3.a1", f3.getDeclaredField(x -> x.hasName("a1")));
-               check("F3.a2", f3.getDeclaredField(x -> x.hasName("a2")));
-               check(null, f3.getDeclaredField(x -> x.hasName("a3")));
+               check("F3.a1", f3.getDeclaredField(x -> 
x.hasName("a1")).orElse(null));
+               check("F3.a2", f3.getDeclaredField(x -> 
x.hasName("a2")).orElse(null));
+               check(null, f3.getDeclaredField(x -> 
x.hasName("a3")).orElse(null));
        }
 
        
//-----------------------------------------------------------------------------------------------------------------
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ConstructorInfoTest.java
 
b/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ConstructorInfoTest.java
index 2502414f90..0861578107 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ConstructorInfoTest.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ConstructorInfoTest.java
@@ -107,10 +107,10 @@ class ConstructorInfoTest extends TestBase {
        }
        static ClassInfo b = ClassInfo.of(B.class);
        static ConstructorInfo
-               b_c1 = b.getPublicConstructor(cons -> cons.getParameterCount() 
== 0),
-               b_c2 = b.getPublicConstructor(x -> 
x.hasParameterTypes(String.class)),
-               b_c3 = b.getDeclaredConstructor(x -> 
x.hasParameterTypes(int.class)),
-               b_c4 = b.getPublicConstructor(x -> 
x.hasParameterTypes(String.class, String.class));
+               b_c1 = b.getPublicConstructor(cons -> cons.getParameterCount() 
== 0).get(),
+               b_c2 = b.getPublicConstructor(x -> 
x.hasParameterTypes(String.class)).get(),
+               b_c3 = b.getDeclaredConstructor(x -> 
x.hasParameterTypes(int.class)).get(),
+               b_c4 = b.getPublicConstructor(x -> 
x.hasParameterTypes(String.class, String.class)).get();
 
        @Test void invoke() throws Exception {
                assertEquals(null, b_c1.newInstanceLenient().toString());
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ExecutableInfo_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ExecutableInfo_Test.java
index 76c6dcf228..a15ab13d9a 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ExecutableInfo_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ExecutableInfo_Test.java
@@ -74,13 +74,13 @@ class ExecutableInfo_Test extends TestBase {
        static ClassInfo a = ClassInfo.of(A.class);
 
        @Test void isConstructor() {
-               assertTrue(a.getPublicConstructor(cons -> 
cons.getParameterCount() == 0).isConstructor());
-               assertFalse(a.getPublicMethod(x -> 
x.hasName("foo")).isConstructor());
+               assertTrue(a.getPublicConstructor(cons -> 
cons.getParameterCount() == 0).get().isConstructor());
+               assertFalse(a.getPublicMethod(x -> 
x.hasName("foo")).get().isConstructor());
        }
 
        @Test void getDeclaringClass() {
-               check("A", a.getPublicConstructor(cons -> 
cons.getParameterCount() == 0).getDeclaringClass());
-               check("A", a.getPublicMethod(x -> 
x.hasName("foo")).getDeclaringClass());
+               check("A", a.getPublicConstructor(cons -> 
cons.getParameterCount() == 0).get().getDeclaringClass());
+               check("A", a.getPublicMethod(x -> 
x.hasName("foo")).get().getDeclaringClass());
        }
 
        
//-----------------------------------------------------------------------------------------------------------------
@@ -95,10 +95,10 @@ class ExecutableInfo_Test extends TestBase {
        }
        static ClassInfo b = ClassInfo.of(B.class);
        static ExecutableInfo
-               b_c1 = b.getPublicConstructor(cons -> cons.getParameterCount() 
== 0),
-               b_c2 = b.getPublicConstructor(x -> 
x.hasParameterTypes(String.class)),
-               b_m1 = b.getPublicMethod(x -> x.hasName("m") && 
x.getParameterCount() == 0),
-               b_m2 = b.getPublicMethod(x -> x.hasName("m") && 
x.hasParameterTypes(String.class))
+               b_c1 = b.getPublicConstructor(cons -> cons.getParameterCount() 
== 0).get(),
+               b_c2 = b.getPublicConstructor(x -> 
x.hasParameterTypes(String.class)).get(),
+               b_m1 = b.getPublicMethod(x -> x.hasName("m") && 
x.getParameterCount() == 0).get(),
+               b_m2 = b.getPublicMethod(x -> x.hasName("m") && 
x.hasParameterTypes(String.class)).get()
        ;
 
        @Test void getParamCount() {
@@ -148,8 +148,8 @@ class ExecutableInfo_Test extends TestBase {
 
        @Test void getParam_nocache() {
                var b2 = ClassInfo.of(B.class);
-               check("B[0]", b2.getPublicConstructor(x -> 
x.hasParameterTypes(String.class)).getParameter(0));
-               check("m[0]", b2.getPublicMethod(x -> x.hasName("m") && 
x.hasParameterTypes(String.class)).getParameter(0));
+               check("B[0]", b2.getPublicConstructor(x -> 
x.hasParameterTypes(String.class)).get().getParameter(0));
+               check("m[0]", b2.getPublicMethod(x -> x.hasName("m") && 
x.hasParameterTypes(String.class)).get().getParameter(0));
        }
 
        @Test void getParam_indexOutOfBounds() {
@@ -160,9 +160,9 @@ class ExecutableInfo_Test extends TestBase {
 
        @Test void getParam_indexOutOfBounds_noCache() {
                var b2 = ClassInfo.of(B.class);
-               assertThrowsWithMessage(IndexOutOfBoundsException.class, 
"Invalid index '0'.  No parameters.", ()->b2.getPublicConstructor(cons -> 
cons.getParameterCount() == 0).getParameter(0));
-               assertThrowsWithMessage(IndexOutOfBoundsException.class, 
"Invalid index '-1'.  Parameter count: 1", ()->b2.getPublicConstructor(x -> 
x.hasParameterTypes(String.class)).getParameter(-1));
-               assertThrowsWithMessage(IndexOutOfBoundsException.class, 
"Invalid index '1'.  Parameter count: 1", ()->b2.getPublicConstructor(x -> 
x.hasParameterTypes(String.class)).getParameter(1));
+               assertThrowsWithMessage(IndexOutOfBoundsException.class, 
"Invalid index '0'.  No parameters.", ()->b2.getPublicConstructor(cons -> 
cons.getParameterCount() == 0).get().getParameter(0));
+               assertThrowsWithMessage(IndexOutOfBoundsException.class, 
"Invalid index '-1'.  Parameter count: 1", ()->b2.getPublicConstructor(x -> 
x.hasParameterTypes(String.class)).get().getParameter(-1));
+               assertThrowsWithMessage(IndexOutOfBoundsException.class, 
"Invalid index '1'.  Parameter count: 1", ()->b2.getPublicConstructor(x -> 
x.hasParameterTypes(String.class)).get().getParameter(1));
        }
 
        @Test void getParamTypes() {
@@ -248,14 +248,14 @@ class ExecutableInfo_Test extends TestBase {
        }
        static ClassInfo c = ClassInfo.of(C.class);
        static ConstructorInfo
-               c_c1=c.getPublicConstructor(cons -> cons.getParameterCount() == 
0),
-               c_c2=c.getPublicConstructor(x -> 
x.hasParameterTypes(String.class)),
-               c_c3=c.getPublicConstructor(x -> x.hasParameterTypes(int.class))
+               c_c1=c.getPublicConstructor(cons -> cons.getParameterCount() == 
0).get(),
+               c_c2=c.getPublicConstructor(x -> 
x.hasParameterTypes(String.class)).get(),
+               c_c3=c.getPublicConstructor(x -> 
x.hasParameterTypes(int.class)).get()
        ;
        static MethodInfo
-               c_m1=c.getPublicMethod(x -> x.hasName("m") && 
x.getParameterCount() == 0),
-               c_m2=c.getPublicMethod(x -> x.hasName("m") && 
x.hasParameterTypes(String.class)),
-               c_m3=c.getPublicMethod(x -> x.hasName("m") && 
x.hasParameterTypes(int.class))
+               c_m1=c.getPublicMethod(x -> x.hasName("m") && 
x.getParameterCount() == 0).get(),
+               c_m2=c.getPublicMethod(x -> x.hasName("m") && 
x.hasParameterTypes(String.class)).get(),
+               c_m3=c.getPublicMethod(x -> x.hasName("m") && 
x.hasParameterTypes(int.class)).get()
        ;
 
        @Test void getParameterAnnotations() {
@@ -292,8 +292,8 @@ class ExecutableInfo_Test extends TestBase {
        }
        static ClassInfo d = ClassInfo.of(D.class);
        static ExecutableInfo
-               d_c=d.getPublicConstructor(cons -> cons.getParameterCount() == 
0),
-               d_m=d.getPublicMethod(x -> x.hasName("m"))
+               d_c=d.getPublicConstructor(cons -> cons.getParameterCount() == 
0).get(),
+               d_m=d.getPublicMethod(x -> x.hasName("m")).get()
        ;
 
        @Test void getExceptionTypes() {
@@ -325,17 +325,17 @@ class ExecutableInfo_Test extends TestBase {
        }
        static ClassInfo e = ClassInfo.of(E.class);
        static ExecutableInfo
-               e_deprecated = e.getPublicMethod(x -> x.hasName("deprecated")),
-               e_notDeprecated = e.getPublicMethod(x -> 
x.hasName("notDeprecated")),
-               e_hasParams = e.getPublicMethod(x -> x.hasName("hasParams")),
-               e_hasStringParam = e.getPublicMethod(x -> 
x.hasName("hasStringParam")),
-               e_hasNoParams = e.getPublicMethod(x -> 
x.hasName("hasNoParams")),
-               e_isPublic = e.getPublicMethod(x -> x.hasName("isPublic")),
-               e_isNotPublic = e.getMethod(x -> x.hasName("isNotPublic")),
-               e_isStatic = e.getPublicMethod(x -> x.hasName("isStatic")),
-               e_isNotStatic = e.getPublicMethod(x -> 
x.hasName("isNotStatic")),
-               e_isAbstract = e.getPublicMethod(x -> x.hasName("isAbstract")),
-               e_isNotAbstract = e.getPublicMethod(x -> 
x.hasName("isNotAbstract"))
+               e_deprecated = e.getPublicMethod(x -> 
x.hasName("deprecated")).get(),
+               e_notDeprecated = e.getPublicMethod(x -> 
x.hasName("notDeprecated")).get(),
+               e_hasParams = e.getPublicMethod(x -> 
x.hasName("hasParams")).get(),
+               e_hasStringParam = e.getPublicMethod(x -> 
x.hasName("hasStringParam")).get(),
+               e_hasNoParams = e.getPublicMethod(x -> 
x.hasName("hasNoParams")).get(),
+               e_isPublic = e.getPublicMethod(x -> 
x.hasName("isPublic")).get(),
+               e_isNotPublic = e.getMethod(x -> 
x.hasName("isNotPublic")).get(),
+               e_isStatic = e.getPublicMethod(x -> 
x.hasName("isStatic")).get(),
+               e_isNotStatic = e.getPublicMethod(x -> 
x.hasName("isNotStatic")).get(),
+               e_isAbstract = e.getPublicMethod(x -> 
x.hasName("isAbstract")).get(),
+               e_isNotAbstract = e.getPublicMethod(x -> 
x.hasName("isNotAbstract")).get()
        ;
 
        @Test void isAll() {
@@ -450,10 +450,10 @@ class ExecutableInfo_Test extends TestBase {
        }
        static ClassInfo f = ClassInfo.of(F.class);
        static ExecutableInfo
-               f_isPublic = f.getPublicMethod(x -> x.hasName("isPublic")),
-               f_isProtected = f.getMethod(x -> x.hasName("isProtected")),
-               f_isPrivate = f.getMethod(x -> x.hasName("isPrivate")),
-               f_isDefault = f.getMethod(x -> x.hasName("isDefault"));
+               f_isPublic = f.getPublicMethod(x -> 
x.hasName("isPublic")).get(),
+               f_isProtected = f.getMethod(x -> 
x.hasName("isProtected")).get(),
+               f_isPrivate = f.getMethod(x -> x.hasName("isPrivate")).get(),
+               f_isDefault = f.getMethod(x -> x.hasName("isDefault")).get();
 
        @Test void setAccessible() {
                assertDoesNotThrow(()->f_isPublic.accessible());
@@ -499,38 +499,38 @@ class ExecutableInfo_Test extends TestBase {
        static ClassInfo x2 = ClassInfo.of(X.class);
 
        @Test void getFullName_method() {
-               
assertEquals("org.apache.juneau.common.reflect.ExecutableInfo_Test$X.foo()", 
x2.getPublicMethod(x -> x.hasName("foo") && x.getParameterCount() == 
0).getFullName());
-               
assertEquals("org.apache.juneau.common.reflect.ExecutableInfo_Test$X.foo(java.lang.String)",
 x2.getPublicMethod(x -> x.hasName("foo") && 
x.hasParameterTypes(String.class)).getFullName());
-               
assertEquals("org.apache.juneau.common.reflect.ExecutableInfo_Test$X.foo(java.util.Map<java.lang.String,java.lang.Object>)",
 x2.getPublicMethod(x -> x.hasName("foo") && 
x.hasParameterTypes(Map.class)).getFullName());
+               
assertEquals("org.apache.juneau.common.reflect.ExecutableInfo_Test$X.foo()", 
x2.getPublicMethod(x -> x.hasName("foo") && x.getParameterCount() == 
0).get().getFullName());
+               
assertEquals("org.apache.juneau.common.reflect.ExecutableInfo_Test$X.foo(java.lang.String)",
 x2.getPublicMethod(x -> x.hasName("foo") && 
x.hasParameterTypes(String.class)).get().getFullName());
+               
assertEquals("org.apache.juneau.common.reflect.ExecutableInfo_Test$X.foo(java.util.Map<java.lang.String,java.lang.Object>)",
 x2.getPublicMethod(x -> x.hasName("foo") && 
x.hasParameterTypes(Map.class)).get().getFullName());
        }
 
        @Test void getFullName_constructor() {
-               
assertEquals("org.apache.juneau.common.reflect.ExecutableInfo_Test$X()", 
x2.getPublicConstructor(cons -> cons.getParameterCount() == 0).getFullName());
-               
assertEquals("org.apache.juneau.common.reflect.ExecutableInfo_Test$X(java.lang.String)",
 x2.getPublicConstructor(x -> x.hasParameterTypes(String.class)).getFullName());
-               
assertEquals("org.apache.juneau.common.reflect.ExecutableInfo_Test$X(java.util.Map<java.lang.String,java.lang.Object>)",
 x2.getPublicConstructor(x -> x.hasParameterTypes(Map.class)).getFullName());
+               
assertEquals("org.apache.juneau.common.reflect.ExecutableInfo_Test$X()", 
x2.getPublicConstructor(cons -> cons.getParameterCount() == 
0).get().getFullName());
+               
assertEquals("org.apache.juneau.common.reflect.ExecutableInfo_Test$X(java.lang.String)",
 x2.getPublicConstructor(x -> 
x.hasParameterTypes(String.class)).get().getFullName());
+               
assertEquals("org.apache.juneau.common.reflect.ExecutableInfo_Test$X(java.util.Map<java.lang.String,java.lang.Object>)",
 x2.getPublicConstructor(x -> 
x.hasParameterTypes(Map.class)).get().getFullName());
        }
 
        @Test void getShortName_method() {
-               assertEquals("foo()", x2.getPublicMethod(x -> x.hasName("foo") 
&& x.getParameterCount() == 0).getShortName());
-               assertEquals("foo(String)", x2.getPublicMethod(x -> 
x.hasName("foo") && x.hasParameterTypes(String.class)).getShortName());
-               assertEquals("foo(Map)", x2.getPublicMethod(x -> 
x.hasName("foo") && x.hasParameterTypes(Map.class)).getShortName());
+               assertEquals("foo()", x2.getPublicMethod(x -> x.hasName("foo") 
&& x.getParameterCount() == 0).get().getShortName());
+               assertEquals("foo(String)", x2.getPublicMethod(x -> 
x.hasName("foo") && x.hasParameterTypes(String.class)).get().getShortName());
+               assertEquals("foo(Map)", x2.getPublicMethod(x -> 
x.hasName("foo") && x.hasParameterTypes(Map.class)).get().getShortName());
        }
 
        @Test void getShortName_constructor() {
-               assertEquals("X()", x2.getPublicConstructor(cons -> 
cons.getParameterCount() == 0).getShortName());
-               assertEquals("X(String)", x2.getPublicConstructor(x -> 
x.hasParameterTypes(String.class)).getShortName());
-               assertEquals("X(Map)", x2.getPublicConstructor(x -> 
x.hasParameterTypes(Map.class)).getShortName());
+               assertEquals("X()", x2.getPublicConstructor(cons -> 
cons.getParameterCount() == 0).get().getShortName());
+               assertEquals("X(String)", x2.getPublicConstructor(x -> 
x.hasParameterTypes(String.class)).get().getShortName());
+               assertEquals("X(Map)", x2.getPublicConstructor(x -> 
x.hasParameterTypes(Map.class)).get().getShortName());
        }
 
        @Test void getSimpleName_method() {
-               assertEquals("foo", x2.getPublicMethod(x -> x.hasName("foo") && 
x.getParameterCount() == 0).getSimpleName());
-               assertEquals("foo", x2.getPublicMethod(x -> x.hasName("foo") && 
x.hasParameterTypes(String.class)).getSimpleName());
-               assertEquals("foo", x2.getPublicMethod(x -> x.hasName("foo") && 
x.hasParameterTypes(Map.class)).getSimpleName());
+               assertEquals("foo", x2.getPublicMethod(x -> x.hasName("foo") && 
x.getParameterCount() == 0).get().getSimpleName());
+               assertEquals("foo", x2.getPublicMethod(x -> x.hasName("foo") && 
x.hasParameterTypes(String.class)).get().getSimpleName());
+               assertEquals("foo", x2.getPublicMethod(x -> x.hasName("foo") && 
x.hasParameterTypes(Map.class)).get().getSimpleName());
        }
 
        @Test void getSimpleName_constructor() {
-               assertEquals("X", x2.getPublicConstructor(cons -> 
cons.getParameterCount() == 0).getSimpleName());
-               assertEquals("X", x2.getPublicConstructor(x -> 
x.hasParameterTypes(String.class)).getSimpleName());
-               assertEquals("X", x2.getPublicConstructor(x -> 
x.hasParameterTypes(Map.class)).getSimpleName());
+               assertEquals("X", x2.getPublicConstructor(cons -> 
cons.getParameterCount() == 0).get().getSimpleName());
+               assertEquals("X", x2.getPublicConstructor(x -> 
x.hasParameterTypes(String.class)).get().getSimpleName());
+               assertEquals("X", x2.getPublicConstructor(x -> 
x.hasParameterTypes(Map.class)).get().getSimpleName());
        }
 }
\ No newline at end of file
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/common/reflect/FieldInfo_AnnotationInfos_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/common/reflect/FieldInfo_AnnotationInfos_Test.java
index a3909bf02b..7dfec97350 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/common/reflect/FieldInfo_AnnotationInfos_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/common/reflect/FieldInfo_AnnotationInfos_Test.java
@@ -55,9 +55,9 @@ public class FieldInfo_AnnotationInfos_Test {
        @Test
        public void testGetAnnotationInfos() {
                var ci = ClassInfo.of(TestClass.class);
-               var field1 = ci.getPublicField(x -> 
x.getName().equals("field1"));
-               var field2 = ci.getPublicField(x -> 
x.getName().equals("field2"));
-               var field3 = ci.getPublicField(x -> 
x.getName().equals("field3"));
+               var field1 = ci.getPublicField(x -> 
x.getName().equals("field1")).get();
+               var field2 = ci.getPublicField(x -> 
x.getName().equals("field2")).get();
+               var field3 = ci.getPublicField(x -> 
x.getName().equals("field3")).get();
 
                // field1 has 2 annotations
                var annotations1 = field1.getDeclaredAnnotations();
@@ -78,8 +78,8 @@ public class FieldInfo_AnnotationInfos_Test {
        @Test
        public void testGetAnnotationInfosTyped() {
                var ci = ClassInfo.of(TestClass.class);
-               var field1 = ci.getPublicField(x -> 
x.getName().equals("field1"));
-               var field2 = ci.getPublicField(x -> 
x.getName().equals("field2"));
+               var field1 = ci.getPublicField(x -> 
x.getName().equals("field1")).get();
+               var field2 = ci.getPublicField(x -> 
x.getName().equals("field2")).get();
 
                // Test filtering by type for field1
                var ann1_type1 = 
field1.getDeclaredAnnotations(TestAnnotation1.class).toList();
@@ -106,7 +106,7 @@ public class FieldInfo_AnnotationInfos_Test {
        @Test
        public void testGetAnnotationInfosMemoization() {
                var ci = ClassInfo.of(TestClass.class);
-               var field1 = ci.getPublicField(x -> 
x.getName().equals("field1"));
+               var field1 = ci.getPublicField(x -> 
x.getName().equals("field1")).get();
 
                // Calling getDeclaredAnnotationInfos() multiple times should 
return the same list instance
                var annotations1 = field1.getDeclaredAnnotations();
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/common/reflect/FieldInfo_FullName_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/common/reflect/FieldInfo_FullName_Test.java
index 94dc3d803a..ece16807be 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/common/reflect/FieldInfo_FullName_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/common/reflect/FieldInfo_FullName_Test.java
@@ -29,8 +29,8 @@ public class FieldInfo_FullName_Test {
        @Test
        public void testGetFullName() {
                var ci = ClassInfo.of(TestClass.class);
-               var field1 = ci.getPublicField(x -> 
x.getName().equals("field1"));
-               var field2 = ci.getPublicField(x -> 
x.getName().equals("field2"));
+               var field1 = ci.getPublicField(x -> 
x.getName().equals("field1")).get();
+               var field2 = ci.getPublicField(x -> 
x.getName().equals("field2")).get();
 
                // Verify full names are correct
                String fullName1 = field1.getFullName();
@@ -47,7 +47,7 @@ public class FieldInfo_FullName_Test {
        @Test
        public void testGetFullNameMemoization() {
                var ci = ClassInfo.of(TestClass.class);
-               var field1 = ci.getPublicField(x -> 
x.getName().equals("field1"));
+               var field1 = ci.getPublicField(x -> 
x.getName().equals("field1")).get();
 
                // Calling getFullName() multiple times should return the same 
String instance (memoized)
                String name1 = field1.getFullName();
@@ -62,7 +62,7 @@ public class FieldInfo_FullName_Test {
        @Test
        public void testGetFullNameWithInnerClass() {
                var ci = ClassInfo.of(InnerClass.class);
-               var field = ci.getPublicField(x -> 
x.getName().equals("innerField"));
+               var field = ci.getPublicField(x -> 
x.getName().equals("innerField")).get();
 
                String fullName = field.getFullName();
                
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/common/reflect/FieldInfo_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/common/reflect/FieldInfo_Test.java
index 7b2ec35704..d9f1817161 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/common/reflect/FieldInfo_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/common/reflect/FieldInfo_Test.java
@@ -142,14 +142,14 @@ class FieldInfo_Test extends TestBase {
        }
        static ClassInfo c = ClassInfo.of(C.class);
        static FieldInfo
-               c_deprecated = c.getPublicField(x -> x.hasName("deprecated")),
-               c_notDeprecated = c.getPublicField(x -> 
x.hasName("notDeprecated")),
-               c_isPublic = c.getPublicField(x -> x.hasName("isPublic")),
-               c_isNotPublic = c.getDeclaredField(x -> 
x.hasName("isNotPublic")),
-               c_isStatic = c.getPublicField(x -> x.hasName("isStatic")),
-               c_isNotStatic = c.getPublicField(x -> x.hasName("isNotStatic")),
-               c_isTransient = c.getPublicField(x -> x.hasName("isTransient")),
-               c_isNotTransient = c.getPublicField(x -> 
x.hasName("isNotTransient"))
+               c_deprecated = c.getPublicField(x -> 
x.hasName("deprecated")).get(),
+               c_notDeprecated = c.getPublicField(x -> 
x.hasName("notDeprecated")).get(),
+               c_isPublic = c.getPublicField(x -> x.hasName("isPublic")).get(),
+               c_isNotPublic = c.getDeclaredField(x -> 
x.hasName("isNotPublic")).get(),
+               c_isStatic = c.getPublicField(x -> x.hasName("isStatic")).get(),
+               c_isNotStatic = c.getPublicField(x -> 
x.hasName("isNotStatic")).get(),
+               c_isTransient = c.getPublicField(x -> 
x.hasName("isTransient")).get(),
+               c_isNotTransient = c.getPublicField(x -> 
x.hasName("isNotTransient")).get()
        ;
 
        @Test void isAll() {
@@ -240,10 +240,10 @@ class FieldInfo_Test extends TestBase {
        }
        static ClassInfo d = ClassInfo.of(D.class);
        static FieldInfo
-               d_isPublic = d.getPublicField(x -> x.hasName("isPublic")),
-               d_isProtected = d.getDeclaredField(x -> 
x.hasName("isProtected")),
-               d_isPrivate = d.getDeclaredField(x -> x.hasName("isPrivate")),
-               d_isDefault = d.getDeclaredField(x -> x.hasName("isDefault"));
+               d_isPublic = d.getPublicField(x -> x.hasName("isPublic")).get(),
+               d_isProtected = d.getDeclaredField(x -> 
x.hasName("isProtected")).get(),
+               d_isPrivate = d.getDeclaredField(x -> 
x.hasName("isPrivate")).get(),
+               d_isDefault = d.getDeclaredField(x -> 
x.hasName("isDefault")).get();
 
        @Test void setAccessible() {
                assertDoesNotThrow(()->d_isPublic.setAccessible());
@@ -285,8 +285,8 @@ class FieldInfo_Test extends TestBase {
 
        static ClassInfo e = ClassInfo.of(E.class);
        static FieldInfo
-               e_a1 = e.getPublicField(x -> x.hasName("a1")),
-               e_a2 = e.getDeclaredField(x -> x.hasName("a2"));
+               e_a1 = e.getPublicField(x -> x.hasName("a1")).get(),
+               e_a2 = e.getDeclaredField(x -> x.hasName("a2")).get();
 
        @Test void getType() {
                check("int", e_a1.getFieldType());
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ParamInfoTest.java
 
b/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ParamInfoTest.java
index b305bd8225..c90fbbebf5 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ParamInfoTest.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ParamInfoTest.java
@@ -112,12 +112,12 @@ class ParamInfoTest extends TestBase {
 
        static ClassInfo b = ClassInfo.of(B.class);
        static ParameterInfo
-               b_b_a = b.getPublicConstructor(x -> 
x.hasParameterTypes(int.class, String.class)).getParameter(0),  // NOSONAR
-               b_b_b = b.getPublicConstructor(x -> 
x.hasParameterTypes(int.class, String.class)).getParameter(1),  // NOSONAR
-               b_a1_a = b.getMethod(x -> x.hasName("a1")).getParameter(0),  // 
NOSONAR
-               b_a1_b = b.getMethod(x -> x.hasName("a1")).getParameter(1),  // 
NOSONAR
-               b_a2_a = b.getMethod(x -> x.hasName("a2")).getParameter(0),  // 
NOSONAR
-               b_a2_b = b.getMethod(x -> x.hasName("a2")).getParameter(1);  // 
NOSONAR
+               b_b_a = b.getPublicConstructor(x -> 
x.hasParameterTypes(int.class, String.class)).get().getParameter(0),  // NOSONAR
+               b_b_b = b.getPublicConstructor(x -> 
x.hasParameterTypes(int.class, String.class)).get().getParameter(1),  // NOSONAR
+               b_a1_a = b.getMethod(x -> 
x.hasName("a1")).get().getParameter(0),  // NOSONAR
+               b_a1_b = b.getMethod(x -> 
x.hasName("a1")).get().getParameter(1),  // NOSONAR
+               b_a2_a = b.getMethod(x -> 
x.hasName("a2")).get().getParameter(0),  // NOSONAR
+               b_a2_b = b.getMethod(x -> 
x.hasName("a2")).get().getParameter(1);  // NOSONAR
 
        @Test void getIndex() {
                assertEquals(0, b_b_a.getIndex());
@@ -191,11 +191,11 @@ class ParamInfoTest extends TestBase {
                cb = ClassInfo.of(CB.class),
                cc = ClassInfo.of(CC.class);
        static ParameterInfo
-               cc_cc = cc.getPublicConstructor(x -> 
x.hasParameterTypes(C1.class)).getParameter(0),  // NOSONAR
-               cb_a1 = cb.getMethod(x -> x.hasName("a1")).getParameter(0),  // 
NOSONAR
-               cb_a2 = cb.getMethod(x -> x.hasName("a2")).getParameter(0),  // 
NOSONAR
-               cc_a1 = cc.getMethod(x -> x.hasName("a1")).getParameter(0),  // 
NOSONAR
-               cc_a2 = cc.getMethod(x -> x.hasName("a2")).getParameter(0);  // 
NOSONAR
+               cc_cc = cc.getPublicConstructor(x -> 
x.hasParameterTypes(C1.class)).get().getParameter(0),  // NOSONAR
+               cb_a1 = cb.getMethod(x -> 
x.hasName("a1")).get().getParameter(0),  // NOSONAR
+               cb_a2 = cb.getMethod(x -> 
x.hasName("a2")).get().getParameter(0),  // NOSONAR
+               cc_a1 = cc.getMethod(x -> 
x.hasName("a1")).get().getParameter(0),  // NOSONAR
+               cc_a2 = cc.getMethod(x -> 
x.hasName("a2")).get().getParameter(0);  // NOSONAR
 
        @Test void getDeclaredAnnotations() {
                check("@CA(5)", declaredAnnotations(cb_a1, CA.class));
@@ -325,8 +325,8 @@ class ParamInfoTest extends TestBase {
                db = ClassInfo.of(DB.class),
                dc = ClassInfo.of(DC.class);
        static ParameterInfo
-               db_a1 = db.getMethod(x -> x.hasName("a1")).getParameter(0),  // 
NOSONAR
-               dc_a1 = dc.getMethod(x -> x.hasName("a1")).getParameter(0);  // 
NOSONAR
+               db_a1 = db.getMethod(x -> 
x.hasName("a1")).get().getParameter(0),  // NOSONAR
+               dc_a1 = dc.getMethod(x -> 
x.hasName("a1")).get().getParameter(0);  // NOSONAR
 
        @Test void getAnnotationsParentFirst_inherited() {
                check("@DA(4),@DA(3),@DA(2),@DA(1),@DA(0)", annotations(db_a1, 
DA.class));
@@ -357,8 +357,8 @@ class ParamInfoTest extends TestBase {
 
        static ClassInfo e = ClassInfo.of(E.class);
        static ParameterInfo
-               e_a1_a = e.getMethod(x -> x.hasName("a1")).getParameter(0),  // 
NOSONAR
-               e_a1_b = e.getMethod(x -> x.hasName("a1")).getParameter(1);  // 
NOSONAR
+               e_a1_a = e.getMethod(x -> 
x.hasName("a1")).get().getParameter(0),  // NOSONAR
+               e_a1_b = e.getMethod(x -> 
x.hasName("a1")).get().getParameter(1);  // NOSONAR
 
        @Test void hasName() {
                // With DISABLE_PARAM_NAME_DETECTION=true, only parameters with 
@Name annotation have names
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/cp/BeanStore_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/cp/BeanStore_Test.java
index f208f50351..4f7185bfae 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/cp/BeanStore_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/cp/BeanStore_Test.java
@@ -279,11 +279,11 @@ class BeanStore_Test extends TestBase {
                var b2c = 
BeanStore.create().outer(outer).parent(b1p).threadSafe().build();
 
                var ci = ClassInfo.of(B1.class);
-               var c1 = ci.getPublicConstructor(x -> 
x.hasParameterTypes(A1.class, Optional.class, BeanStore.class));
-               var c2 = ci.getPublicConstructor(x -> 
x.hasParameterTypes(A1.class, Optional.class));
-               var m1 = ci.getPublicMethod(x-> x.hasName("m1"));
-               var m2 = ci.getPublicMethod(x-> x.hasName("m2"));
-               var m3 = ci.getPublicMethod(x-> x.hasName("m3"));
+               var c1 = ci.getPublicConstructor(x -> 
x.hasParameterTypes(A1.class, Optional.class, BeanStore.class)).get();
+               var c2 = ci.getPublicConstructor(x -> 
x.hasParameterTypes(A1.class, Optional.class)).get();
+               var m1 = ci.getPublicMethod(x-> x.hasName("m1")).get();
+               var m2 = ci.getPublicMethod(x-> x.hasName("m2")).get();
+               var m3 = ci.getPublicMethod(x-> x.hasName("m3")).get();
 
                for (var b : array(b1p, b1c, b2p, b2c)) {
                        for (var e : array(c1, m1, m3)) {
@@ -413,8 +413,8 @@ class BeanStore_Test extends TestBase {
                var b2c = 
BeanStore.create().outer(this).parent(b1p).threadSafe().build();
 
                var ci = ClassInfo.of(B2.class);
-               var c1 = ci.getPublicConstructor(x -> 
x.hasParameterTypes(BeanStore_Test.class, A1.class, Optional.class, 
BeanStore.class));
-               var c2 = ci.getPublicConstructor(x -> 
x.hasParameterTypes(BeanStore_Test.class, A1.class, Optional.class));
+               var c1 = ci.getPublicConstructor(x -> 
x.hasParameterTypes(BeanStore_Test.class, A1.class, Optional.class, 
BeanStore.class)).get();
+               var c2 = ci.getPublicConstructor(x -> 
x.hasParameterTypes(BeanStore_Test.class, A1.class, Optional.class)).get();
 
                for (var b : array(b1p, b1c, b2p, b2c)) {
                        assertString(A1n, b.getMissingParams(c1));
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/reflect/ParamInfoTest.java 
b/juneau-utest/src/test/java/org/apache/juneau/reflect/ParamInfoTest.java
index 6626f7f510..eb3cd7420c 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/reflect/ParamInfoTest.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/reflect/ParamInfoTest.java
@@ -90,12 +90,12 @@ class ParamInfoTest extends TestBase {
 
        static ClassInfo b = ClassInfo.of(B.class);
        static ParameterInfo
-               b_b_a = b.getPublicConstructor(x -> 
x.hasParameterTypes(int.class, String.class)).getParameter(0),  // NOSONAR
-               b_b_b = b.getPublicConstructor(x -> 
x.hasParameterTypes(int.class, String.class)).getParameter(1),  // NOSONAR
-               b_a1_a = b.getMethod(x -> x.hasName("a1")).getParameter(0),  // 
NOSONAR
-               b_a1_b = b.getMethod(x -> x.hasName("a1")).getParameter(1),  // 
NOSONAR
-               b_a2_a = b.getMethod(x -> x.hasName("a2")).getParameter(0),  // 
NOSONAR
-               b_a2_b = b.getMethod(x -> x.hasName("a2")).getParameter(1);  // 
NOSONAR
+               b_b_a = b.getPublicConstructor(x -> 
x.hasParameterTypes(int.class, String.class)).get().getParameter(0),  // NOSONAR
+               b_b_b = b.getPublicConstructor(x -> 
x.hasParameterTypes(int.class, String.class)).get().getParameter(1),  // NOSONAR
+               b_a1_a = b.getMethod(x -> 
x.hasName("a1")).get().getParameter(0),  // NOSONAR
+               b_a1_b = b.getMethod(x -> 
x.hasName("a1")).get().getParameter(1),  // NOSONAR
+               b_a2_a = b.getMethod(x -> 
x.hasName("a2")).get().getParameter(0),  // NOSONAR
+               b_a2_b = b.getMethod(x -> 
x.hasName("a2")).get().getParameter(1);  // NOSONAR
 
        @Test void getIndex() {
                assertEquals(0, b_b_a.getIndex());
@@ -169,11 +169,11 @@ class ParamInfoTest extends TestBase {
                cb = ClassInfo.of(CB.class),
                cc = ClassInfo.of(CC.class);
        static ParameterInfo
-               cc_cc = cc.getPublicConstructor(x -> 
x.hasParameterTypes(C1.class)).getParameter(0),  // NOSONAR
-               cb_a1 = cb.getMethod(x -> x.hasName("a1")).getParameter(0),  // 
NOSONAR
-               cb_a2 = cb.getMethod(x -> x.hasName("a2")).getParameter(0),  // 
NOSONAR
-               cc_a1 = cc.getMethod(x -> x.hasName("a1")).getParameter(0),  // 
NOSONAR
-               cc_a2 = cc.getMethod(x -> x.hasName("a2")).getParameter(0);  // 
NOSONAR
+               cc_cc = cc.getPublicConstructor(x -> 
x.hasParameterTypes(C1.class)).get().getParameter(0),  // NOSONAR
+               cb_a1 = cb.getMethod(x -> 
x.hasName("a1")).get().getParameter(0),  // NOSONAR
+               cb_a2 = cb.getMethod(x -> 
x.hasName("a2")).get().getParameter(0),  // NOSONAR
+               cc_a1 = cc.getMethod(x -> 
x.hasName("a1")).get().getParameter(0),  // NOSONAR
+               cc_a2 = cc.getMethod(x -> 
x.hasName("a2")).get().getParameter(0);  // NOSONAR
 
        @Test void getDeclaredAnnotations() {
                check("@CA(5)", declaredAnnotations(cb_a1, CA.class));
@@ -303,8 +303,8 @@ class ParamInfoTest extends TestBase {
                db = ClassInfo.of(DB.class),
                dc = ClassInfo.of(DC.class);
        static ParameterInfo
-               db_a1 = db.getMethod(x -> x.hasName("a1")).getParameter(0),  // 
NOSONAR
-               dc_a1 = dc.getMethod(x -> x.hasName("a1")).getParameter(0);  // 
NOSONAR
+               db_a1 = db.getMethod(x -> 
x.hasName("a1")).get().getParameter(0),  // NOSONAR
+               dc_a1 = dc.getMethod(x -> 
x.hasName("a1")).get().getParameter(0);  // NOSONAR
 
        @Test void getAnnotationsParentFirst_inherited() {
                check("@DA(4),@DA(3),@DA(2),@DA(1),@DA(0)", annotations(db_a1, 
DA.class));
@@ -335,8 +335,8 @@ class ParamInfoTest extends TestBase {
 
        static ClassInfo e = ClassInfo.of(E.class);
        static ParameterInfo
-               e_a1_a = e.getMethod(x -> x.hasName("a1")).getParameter(0),  // 
NOSONAR
-               e_a1_b = e.getMethod(x -> x.hasName("a1")).getParameter(1);  // 
NOSONAR
+               e_a1_a = e.getMethod(x -> 
x.hasName("a1")).get().getParameter(0),  // NOSONAR
+               e_a1_b = e.getMethod(x -> 
x.hasName("a1")).get().getParameter(1);  // NOSONAR
 
        @Test void hasName() {
                e_a1_a.hasName();  // This might be true or false based on the 
JVM compiler used.
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_Test.java
index 25546809aa..8151a78f91 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_Test.java
@@ -276,9 +276,9 @@ class RestClient_Test extends TestBase {
                var x1 = RestClient.create().json5().pooled().build();
                var x2 = RestClient.create().json5().build();
                var x3 = client().pooled().build();
-               
assertEquals("PoolingHttpClientConnectionManager",ClassInfo.of(x1.httpClient).getDeclaredField(x
 -> 
x.hasName("connManager")).accessible().get(x1.httpClient).getClass().getSimpleName());
-               
assertEquals("BasicHttpClientConnectionManager",ClassInfo.of(x2.httpClient).getDeclaredField(x
 -> 
x.hasName("connManager")).accessible().get(x2.httpClient).getClass().getSimpleName());
-               
assertEquals("MockHttpClientConnectionManager",ClassInfo.of(x3.httpClient).getDeclaredField(x
 -> 
x.hasName("connManager")).accessible().get(x3.httpClient).getClass().getSimpleName());
+               
assertEquals("PoolingHttpClientConnectionManager",ClassInfo.of(x1.httpClient).getDeclaredField(x
 -> 
x.hasName("connManager")).get().accessible().get(x1.httpClient).getClass().getSimpleName());
+               
assertEquals("BasicHttpClientConnectionManager",ClassInfo.of(x2.httpClient).getDeclaredField(x
 -> 
x.hasName("connManager")).get().accessible().get(x2.httpClient).getClass().getSimpleName());
+               
assertEquals("MockHttpClientConnectionManager",ClassInfo.of(x3.httpClient).getDeclaredField(x
 -> 
x.hasName("connManager")).get().accessible().get(x3.httpClient).getClass().getSimpleName());
        }
 
        
//------------------------------------------------------------------------------------------------------------------

Reply via email to