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 d63137b  BeanStore refactoring.
d63137b is described below

commit d63137bd5673673f6fc358ee9df82e254e8e9b24
Author: JamesBognar <[email protected]>
AuthorDate: Sat Jan 22 14:45:10 2022 -0500

    BeanStore refactoring.
---
 .../src/main/java/org/apache/juneau/ClassMeta.java |  10 +-
 .../java/org/apache/juneau/http/HttpParts.java     |   4 +-
 .../apache/juneau/http/header/HeaderBeanMeta.java  |   8 +-
 .../org/apache/juneau/http/part/PartBeanMeta.java  |   8 +-
 .../org/apache/juneau/internal/ClassUtils.java     |   6 +-
 .../java/org/apache/juneau/parser/ParserSet.java   |   2 +-
 .../java/org/apache/juneau/reflect/ClassInfo.java  | 111 +--------------------
 .../java/org/apache/juneau/reflect/Mutaters.java   |   2 +-
 .../apache/juneau/serializer/SerializerSet.java    |   2 +-
 .../java/org/apache/juneau/swap/BuilderSwap.java   |  20 +++-
 .../apache/juneau/rest/client/ResponseBody.java    |   4 +-
 .../apache/juneau/rest/client/ResponseHeader.java  |   4 +-
 .../org/apache/juneau/rest/client/RestRequest.java |   8 +-
 .../apache/juneau/rest/HttpRuntimeException.java   |   4 +-
 .../java/org/apache/juneau/rest/RestContext.java   |   4 +-
 .../java/org/apache/juneau/cp/BeanStore_Test.java  |   8 +-
 .../apache/juneau/reflection/ClassInfoTest.java    |  78 ++-------------
 .../juneau/reflection/ConstructorInfoTest.java     |   6 +-
 .../juneau/reflection/ExecutableInfoTest.java      |  42 ++++----
 .../apache/juneau/reflection/ParamInfoTest.java    |   6 +-
 20 files changed, 94 insertions(+), 243 deletions(-)

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 f3d948f..6ae7ce6 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
@@ -440,8 +440,8 @@ public final class ClassMeta<T> implements Type {
                                ci.getPublicMethod(
                                        x -> x.isStatic()
                                        && x.isNotDeprecated()
-                                       && x.hasReturnType(c) 
-                                       && x.hasParamTypes(String.class) 
+                                       && x.hasReturnType(c)
+                                       && x.hasParamTypes(String.class)
                                        && ArrayUtils.contains(x.getName(), 
fromStringMethodNames))
                                ).map(x -> x.inner())
                                .orElse(null);
@@ -451,7 +451,7 @@ public final class ClassMeta<T> implements Type {
                                ci.getPublicMethod(
                                        x -> x.isStatic()
                                        && x.isNotDeprecated()
-                                       && x.hasName("example") 
+                                       && x.hasName("example")
                                        && 
x.hasFuzzyParamTypes(BeanSession.class))
                                ).map(x -> x.inner())
                                .orElse(null);
@@ -525,7 +525,7 @@ public final class ClassMeta<T> implements Type {
                        primitiveDefault = ci.getPrimitiveDefault();
 
                        ci.getPublicMethods(
-                               x -> x.isNotDeprecated(), 
+                               x -> x.isNotDeprecated(),
                                x -> publicMethods.put(x.getSignature(), 
x.inner())
                        );
 
@@ -554,7 +554,7 @@ public final class ClassMeta<T> implements Type {
 
                        if (innerClass != Object.class) {
                                ClassInfo x = implClass == null ? ci : 
ClassInfo.of(implClass);
-                               noArgConstructor = x.getPublicConstructor();
+                               noArgConstructor = x.getPublicConstructor(y -> 
y.hasNoParams());
                        }
 
                        try {
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/HttpParts.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/HttpParts.java
index 52e86d6..ac2e4ef 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/HttpParts.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/HttpParts.java
@@ -460,9 +460,9 @@ public class HttpParts {
 
        private static final Function<ClassMeta<?>,ConstructorInfo> 
CONSTRUCTOR_FUNCTION = x -> {
                ClassInfo ci = x.getInfo();
-               ConstructorInfo cc = ci.getConstructor(Visibility.PUBLIC, 
String.class);
+               ConstructorInfo cc = ci.getPublicConstructor(y -> 
y.hasParamTypes(String.class));
                if (cc == null)
-                       cc = ci.getConstructor(Visibility.PUBLIC, String.class, 
String.class);
+                       cc = ci.getPublicConstructor(y -> 
y.hasParamTypes(String.class, String.class));
                return cc;
        };
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderBeanMeta.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderBeanMeta.java
index 8c5cf73..d3886e3 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderBeanMeta.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderBeanMeta.java
@@ -91,13 +91,13 @@ public class HeaderBeanMeta<T> {
 
                ClassInfo ci = ClassInfo.of(type);
 
-               ConstructorInfo cci = ci.getPublicConstructor(String.class);
+               ConstructorInfo cci = ci.getPublicConstructor(x -> 
x.hasParamTypes(String.class));
                if (cci == null)
-                       cci = ci.getPublicConstructor(Object.class);
+                       cci = ci.getPublicConstructor(x -> 
x.hasParamTypes(Object.class));
                if (cci == null)
-                       cci = ci.getPublicConstructor(String.class, 
String.class);
+                       cci = ci.getPublicConstructor(x -> 
x.hasParamTypes(String.class, String.class));
                if (cci == null)
-                       cci = ci.getPublicConstructor(String.class, 
Object.class);
+                       cci = ci.getPublicConstructor(x -> 
x.hasParamTypes(String.class, Object.class));
                constructor = cci == null ? null : cci.inner();
 
                this.schema = 
HttpPartSchema.create(org.apache.juneau.http.annotation.Header.class, type);
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/part/PartBeanMeta.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/part/PartBeanMeta.java
index 2dcd704..2920b25 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/part/PartBeanMeta.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/part/PartBeanMeta.java
@@ -92,13 +92,13 @@ public class PartBeanMeta<T> {
 
                ClassInfo ci = ClassInfo.of(type);
 
-               ConstructorInfo cci = ci.getPublicConstructor(String.class);
+               ConstructorInfo cci = ci.getPublicConstructor(x -> 
x.hasParamTypes(String.class));
                if (cci == null)
-                       cci = ci.getPublicConstructor(Object.class);
+                       cci = ci.getPublicConstructor(x -> 
x.hasParamTypes(Object.class));
                if (cci == null)
-                       cci = ci.getPublicConstructor(String.class, 
String.class);
+                       cci = ci.getPublicConstructor(x -> 
x.hasParamTypes(String.class, String.class));
                if (cci == null)
-                       cci = ci.getPublicConstructor(String.class, 
Object.class);
+                       cci = ci.getPublicConstructor(x -> 
x.hasParamTypes(String.class, Object.class));
                constructor = cci == null ? null : cci.inner();
 
                if (ci.hasAnnotation(Query.class))
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ClassUtils.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ClassUtils.java
index 3be64eb..5aa99b5 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ClassUtils.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ClassUtils.java
@@ -121,14 +121,16 @@ public final class ClassUtils {
                                        return null;
 
                                // First look for an exact match.
-                               ConstructorInfo con = 
c3.getPublicConstructor(args);
+                               Object[] args2 = args;
+                               ConstructorInfo con = c3.getPublicConstructor(x 
-> x.canAccept(args2));
                                if (con != null)
                                        return con.<T>invoke(args);
 
                                // Next look for an exact match including the 
outer.
                                if (outer != null) {
                                        args = 
AList.of(outer).append(args).toArray();
-                                       con = c3.getPublicConstructor(args);
+                                       Object[] args3 = args;
+                                       con = c3.getPublicConstructor(x -> 
x.canAccept(args3));
                                        if (con != null)
                                                return con.<T>invoke(args);
                                }
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 2498ca8..8154ee4 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
@@ -322,7 +322,7 @@ public final class ParserSet {
                        if (o instanceof Class) {
 
                                // Check for no-arg constructor.
-                               ConstructorInfo ci = 
ClassInfo.of((Class<?>)o).getPublicConstructor();
+                               ConstructorInfo ci = 
ClassInfo.of((Class<?>)o).getPublicConstructor(x -> x.hasNoParams());
                                if (ci != null)
                                        return ci.invoke();
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ClassInfo.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ClassInfo.java
index c8fbd39..504abce 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ClassInfo.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ClassInfo.java
@@ -13,12 +13,9 @@
 package org.apache.juneau.reflect;
 
 import static org.apache.juneau.internal.StringUtils.*;
-import static org.apache.juneau.reflect.ReflectFlags.*;
 import static org.apache.juneau.assertions.Assertions.*;
 import static org.apache.juneau.internal.ThrowableUtils.*;
 import static org.apache.juneau.internal.ObjectUtils.*;
-import static org.apache.juneau.reflect.ReflectionFilters.*;
-
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 import java.util.*;
@@ -600,46 +597,6 @@ public final class ClassInfo {
        }
 
        
//-----------------------------------------------------------------------------------------------------------------
-       // Special methods
-       
//-----------------------------------------------------------------------------------------------------------------
-
-       /**
-        * Returns the <c>public static Builder create()</c> method on this 
class.
-        *
-        * @return The <c>public static Builder create()</c> method on this 
class, or <jk>null</jk> if it doesn't exist.
-        */
-       public Optional<MethodInfo> getBuilderCreateMethod() {
-               return getPublicConstructors()
-                       .stream()
-                       .filter(x -> x.hasNumParams(1))
-                       .map(x -> x.getParam(0).getParameterType())
-                       .filter(x -> ne(x.inner(), c))  // Ignore 
copy-constructor.
-                       .map(x -> getStaticCreator(x))
-                       .filter(x -> x.isPresent())
-                       .findFirst()
-                       .orElse(Optional.empty());
-       }
-
-       private Optional<MethodInfo> getStaticCreator(ClassInfo ci) {
-               return getPublicMethods()
-                       .stream()
-                       .filter(x -> x.isAll(PUBLIC, STATIC) && 
x.hasName("create") && x.hasReturnType(ci))
-                       .findFirst();
-       }
-
-       /**
-        * Returns the <c>T build()</c> method on this class.
-        *
-        * @return The <c>T build()</c> method on this class, or {@link 
Optional#empty()} if it doesn't exist.
-        */
-       public Optional<MethodInfo> getBuilderBuildMethod() {
-               return getDeclaredMethods()
-                       .stream()
-                       .filter(x -> x.isAll(NOT_STATIC) && x.hasName("build") 
&& (!x.hasParams()) && (!x.hasReturnType(void.class)))
-                       .findFirst();
-       }
-
-       
//-----------------------------------------------------------------------------------------------------------------
        // Constructors
        
//-----------------------------------------------------------------------------------------------------------------
 
@@ -666,17 +623,6 @@ public final class ClassInfo {
        }
 
        /**
-        * Returns the public constructor with the specified argument types.
-        *
-        * @param args The exact argument types.
-        * @return
-        *  The public constructor with the specified argument types, or 
<jk>null</jk> if not found.
-        */
-       public ConstructorInfo getPublicConstructor(Class<?>...args) {
-               return 
Arrays.stream(_getPublicConstructors()).filter(hasArgs(args)).findFirst().orElse(null);
-       }
-
-       /**
         * Returns the public constructor that passes the specified predicate 
test.
         *
         * <p>
@@ -685,8 +631,11 @@ public final class ClassInfo {
         * @param test The test that the public constructor must pass.
         * @return The first matching public constructor.
         */
-       public Optional<ConstructorInfo> 
getConstructor(Predicate<ExecutableInfo> test) {
-               return 
Arrays.stream(_getDeclaredConstructors()).filter(test).findFirst();
+       public ConstructorInfo getConstructor(Predicate<ExecutableInfo> test) {
+               for (ConstructorInfo ci : _getDeclaredConstructors())
+                       if (test.test(ci))
+                               return ci;
+               return null;
        }
 
        /**
@@ -703,20 +652,6 @@ public final class ClassInfo {
        }
 
        /**
-        * Same as {@link #getPublicConstructor(Class...)} but allows for 
inexact arg type matching.
-        *
-        * <p>
-        * For example, the method <c>foo(CharSequence)</c> will be matched by 
<code>getAvailablePublicConstructor(String.<jk>class</jk>)</code>
-        *
-        * @param args The exact argument types.
-        * @return
-        *  The public constructor with the specified argument types, or 
<jk>null</jk> if not found.
-        */
-       public ConstructorInfo getAvailablePublicConstructor(Class<?>...args) {
-               return _getConstructor(Visibility.PUBLIC, false, args);
-       }
-
-       /**
         * Returns all the constructors defined on this class.
         *
         * @return All constructors defined on this class.
@@ -726,18 +661,6 @@ public final class ClassInfo {
        }
 
        /**
-        * Finds the public constructor that can take in the specified 
arguments.
-        *
-        * @param args The arguments we want to pass into the constructor.
-        * @return
-        *      The constructor, or <jk>null</jk> if a public constructor could 
not be found that takes in the specified
-        *      arguments.
-        */
-       public ConstructorInfo getPublicConstructor(Object...args) {
-               return getPublicConstructor(ClassUtils.getClasses(args));
-       }
-
-       /**
         * Finds the public constructor that can take in the specified 
arguments using fuzzy-arg matching.
         *
         * @param args The arguments we want to pass into the constructor.
@@ -749,30 +672,6 @@ public final class ClassInfo {
                return _getConstructor(Visibility.PUBLIC, true, 
ClassUtils.getClasses(args));
        }
 
-       /**
-        * Finds the public constructor that can take in the specified 
arguments using fuzzy-arg matching.
-        *
-        * @param args The arguments we want to pass into the constructor.
-        * @return
-        *      The constructor, never <jk>null</jk>.
-        */
-       public Optional<ConstructorInfo> 
getOptionalPublicConstructorFuzzy(Object...args) {
-               return Optional.ofNullable(_getConstructor(Visibility.PUBLIC, 
true, ClassUtils.getClasses(args)));
-       }
-
-       /**
-        * Finds a constructor with the specified parameters without throwing 
an exception.
-        *
-        * @param vis The minimum visibility.
-        * @param argTypes
-        *      The argument types in the constructor.
-        *      Can be subtypes of the actual constructor argument types.
-        * @return The matching constructor, or <jk>null</jk> if constructor 
could not be found.
-        */
-       public ConstructorInfo getConstructor(Visibility vis, 
Class<?>...argTypes) {
-               return _getConstructor(vis, false, argTypes);
-       }
-
        private ConstructorInfo[] _getPublicConstructors() {
                if (publicConstructors == null) {
                        Constructor<?>[] cc = c == null ? new Constructor[0] : 
c.getConstructors();
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 fcc6bd0..1c91d68 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
@@ -216,7 +216,7 @@ public class Mutaters {
                        }
                }
 
-               ConstructorInfo c = oci.getPublicConstructor(ic);
+               ConstructorInfo c = oci.getPublicConstructor(x -> 
x.hasParamTypes(ic));
                if (c != null && c.isNotDeprecated()) {
                        boolean isMemberClass = oci.isNonStaticMemberClass();
                        return new Mutater() {
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 080a90f..9e03ccc 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
@@ -318,7 +318,7 @@ public final class SerializerSet {
                        if (o instanceof Class) {
 
                                // Check for no-arg constructor.
-                               ConstructorInfo ci = 
ClassInfo.of((Class<?>)o).getPublicConstructor();
+                               ConstructorInfo ci = 
ClassInfo.of((Class<?>)o).getPublicConstructor(x -> x.hasNoParams());
                                if (ci != null)
                                        return ci.invoke();
 
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 92ba2a8..eca3489 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
@@ -151,7 +151,7 @@ public class BuilderSwap<T,B> {
                ConstructorInfo objectConstructor;
                ConstructorInfo builderConstructor;
 
-               createObjectMethod = bci.getBuilderBuildMethod().orElse(null);
+               createObjectMethod = getBuilderBuildMethod(bci);
                if (createObjectMethod != null)
                        objectClass = 
createObjectMethod.getReturnType().inner();
 
@@ -160,12 +160,12 @@ public class BuilderSwap<T,B> {
 
                ClassInfo pci = ClassInfo.of(objectClass);
 
-               objectConstructor = pci.getConstructor(cVis, builderClass);
+               objectConstructor = pci.getConstructor(x -> x.isVisible(cVis) 
&& x.hasParamTypes(builderClass));
                if (objectConstructor == null)
                        return null;
 
                builderConstructor = bci.getNoArgConstructor(cVis);
-               createBuilderMethod = pci.getBuilderCreateMethod().orElse(null);
+               createBuilderMethod = getBuilderCreateMethod(pci);
                if (builderConstructor == null && createBuilderMethod == null)
                        return null;
 
@@ -220,9 +220,10 @@ public class BuilderSwap<T,B> {
                if (builderConstructor == null && builderCreateMethod == null)
                        return null;
 
-               objectCreateMethod = bci.getBuilderBuildMethod().orElse(null);
+               objectCreateMethod = getBuilderBuildMethod(bci);
+               Class<?> builderClass2 = builderClass;
                if (objectConstructor == null)
-                       objectConstructor = pci.getConstructor(cVis, 
builderClass);
+                       objectConstructor = pci.getConstructor(x -> 
x.isVisible(cVis) && x.hasParamTypes(builderClass2));
 
                if (objectConstructor == null && objectCreateMethod == null)
                        return null;
@@ -245,4 +246,13 @@ public class BuilderSwap<T,B> {
                        && x.hasParamTypes(argType)
                ) != null;
        }
+
+       private static MethodInfo getBuilderBuildMethod(ClassInfo c) {
+               return c.getDeclaredMethod(
+                       x -> x.isNotStatic()
+                       && x.hasNoParams()
+                       && (!x.hasReturnType(void.class))
+                       && x.hasName("build")
+               );
+       }
 }
\ No newline at end of file
diff --git 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/ResponseBody.java
 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/ResponseBody.java
index cf48cf0..c0a5060 100644
--- 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/ResponseBody.java
+++ 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/ResponseBody.java
@@ -675,7 +675,7 @@ public class ResponseBody implements HttpEntity {
                        if (type.is(HttpResource.class))
                                type = 
(ClassMeta<T>)getClassMeta(BasicResource.class);
 
-                       ConstructorInfo ci = 
type.getInfo().getPublicConstructor(HttpResponse.class);
+                       ConstructorInfo ci = 
type.getInfo().getPublicConstructor(x -> x.hasParamTypes(HttpResponse.class));
                        if (ci != null) {
                                try {
                                        return (T)ci.invoke(response);
@@ -710,7 +710,7 @@ public class ResponseBody 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();
+                                               ConstructorInfo c = 
type.getInfo().getPublicConstructor(x -> x.hasNoParams());
                                                if (c != null) {
                                                        try {
                                                                return 
c.<T>invoke();
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 ba93c71..780716c 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
@@ -227,10 +227,10 @@ public class ResponseHeader implements Header {
        public <T extends BasicHeader> T asHeader(Class<T> c) {
                try {
                        ClassInfo ci = ClassInfo.of(c);
-                       ConstructorInfo cc = 
ci.getConstructor(Visibility.PUBLIC, String.class);
+                       ConstructorInfo cc = ci.getPublicConstructor(x -> 
x.hasParamTypes(String.class));
                        if (cc != null)
                                return cc.invoke(getValue());
-                       cc = ci.getConstructor(Visibility.PUBLIC, String.class, 
String.class);
+                       cc = ci.getPublicConstructor(x -> 
x.hasParamTypes(String.class, String.class));
                        if (cc != null)
                                return cc.invoke(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 8842b36..0d1b862 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
@@ -2565,16 +2565,16 @@ public class RestRequest extends BeanSession implements 
HttpUriRequest, Configur
                                        if (t.getName().equals(className)) {
                                                ConstructorInfo c = null;
                                                ClassInfo ci = ClassInfo.of(t);
-                                               c = 
ci.getPublicConstructor(HttpResponse.class);
+                                               c = ci.getPublicConstructor(x 
-> x.hasParamTypes(HttpResponse.class));
                                                if (c != null)
                                                        throw 
c.<Throwable>invoke(response);
-                                               c = 
ci.getPublicConstructor(String.class);
+                                               c = ci.getPublicConstructor(x 
-> x.hasParamTypes(String.class));
                                                if (c != null)
                                                        throw 
c.<Throwable>invoke(message != null ? message : response.getBody().asString());
-                                               c = 
ci.getPublicConstructor(String.class,Throwable.class);
+                                               c = ci.getPublicConstructor(x 
-> x.hasParamTypes(String.class,Throwable.class));
                                                if (c != null)
                                                        throw 
c.<Throwable>invoke(message != null ? message : response.getBody().asString(), 
null);
-                                               c = ci.getPublicConstructor();
+                                               c = ci.getPublicConstructor(x 
-> x.hasNoParams());
                                                if (c != null)
                                                        throw 
c.<Throwable>invoke();
                                        }
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/HttpRuntimeException.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/HttpRuntimeException.java
index b21b7ff..384e10a 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/HttpRuntimeException.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/HttpRuntimeException.java
@@ -106,11 +106,11 @@ public final class HttpRuntimeException extends 
BasicRuntimeException {
                ClassInfo eci = ClassInfo.ofc(ec);
 
                try {
-                       ConstructorInfo cci = 
eci.getPublicConstructor(Throwable.class, String.class, Object[].class);
+                       ConstructorInfo cci = eci.getPublicConstructor(x -> 
x.hasParamTypes(Throwable.class, String.class, Object[].class));
                        if (cci != null)
                                return toHttpException((Throwable)cci.invoke(t, 
msg, args), InternalServerError.class);
 
-                       cci = eci.getPublicConstructor(Throwable.class);
+                       cci = eci.getPublicConstructor(x -> 
x.hasParamTypes(Throwable.class));
                        if (cci != null)
                                return 
toHttpException((Throwable)cci.invoke(t), InternalServerError.class);
 
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 550ab8c..7096732 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
@@ -6907,11 +6907,11 @@ public class RestContext extends Context {
                ClassInfo eci = ClassInfo.ofc(defaultThrowable);
 
                try {
-                       ConstructorInfo cci = 
eci.getPublicConstructor(Throwable.class, String.class, Object[].class);
+                       ConstructorInfo cci = eci.getPublicConstructor(x -> 
x.hasParamTypes(Throwable.class, String.class, Object[].class));
                        if (cci != null)
                                return 
toHttpException((Throwable)cci.invoke(t), InternalServerError.class);
 
-                       cci = eci.getPublicConstructor(Throwable.class);
+                       cci = eci.getPublicConstructor(x -> 
x.hasParamTypes(Throwable.class));
                        if (cci != null)
                                return 
toHttpException((Throwable)cci.invoke(t), InternalServerError.class);
 
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 86d0991..84ec21e 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
@@ -270,8 +270,8 @@ public class BeanStore_Test {
                BeanStore b2c = 
BeanStore.create().outer(outer).parent(b1p).threadSafe().build();
 
                ClassInfo ci = ClassInfo.of(B1.class);
-               ConstructorInfo c1 = ci.getPublicConstructor(A1.class, 
Optional.class, BeanStore.class);
-               ConstructorInfo c2 = ci.getPublicConstructor(A1.class, 
Optional.class);
+               ConstructorInfo c1 = ci.getPublicConstructor(x -> 
x.hasParamTypes(A1.class, Optional.class, BeanStore.class));
+               ConstructorInfo c2 = ci.getPublicConstructor(x -> 
x.hasParamTypes(A1.class, Optional.class));
                MethodInfo m1 = ci.getPublicMethod(x-> x.hasName("m1"));
                MethodInfo m2 = ci.getPublicMethod(x-> x.hasName("m2"));
                MethodInfo m3 = ci.getPublicMethod(x-> x.hasName("m3"));
@@ -405,8 +405,8 @@ public class BeanStore_Test {
                BeanStore b2c = 
BeanStore.create().outer(this).parent(b1p).threadSafe().build();
 
                ClassInfo ci = ClassInfo.of(B2.class);
-               ConstructorInfo c1 = 
ci.getPublicConstructor(BeanStore_Test.class, A1.class, Optional.class, 
BeanStore.class);
-               ConstructorInfo c2 = 
ci.getPublicConstructor(BeanStore_Test.class, A1.class, Optional.class);
+               ConstructorInfo c1 = ci.getPublicConstructor(x -> 
x.hasParamTypes(BeanStore_Test.class, A1.class, Optional.class, 
BeanStore.class));
+               ConstructorInfo c2 = ci.getPublicConstructor(x -> 
x.hasParamTypes(BeanStore_Test.class, A1.class, Optional.class));
 
                for (BeanStore b : array(b1p, b1c, b2p, b2c)) {
                        assertString(b.getMissingParams(c1)).is(A1n);
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/reflection/ClassInfoTest.java 
b/juneau-utest/src/test/java/org/apache/juneau/reflection/ClassInfoTest.java
index ed3c1bc..4156728 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/reflection/ClassInfoTest.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/reflection/ClassInfoTest.java
@@ -399,65 +399,6 @@ public class ClassInfoTest {
        }
 
        
//-----------------------------------------------------------------------------------------------------------------
-       // Special methods
-       
//-----------------------------------------------------------------------------------------------------------------
-
-       static class DCx {}
-       static class DC1 {
-               public static DCx create() {return null;}
-               public DC1(DCx x) {}
-       }
-       static class DC2 {
-               protected static DCx create() {return null;}
-       }
-       static class DC3 {
-               public DCx create() {return null;}
-       }
-       static class DC4 {
-               public static void create() {}
-       }
-       static class DC5 {
-               public static DCx createFoo() {return null;}
-       }
-       static ClassInfo dc1=of(DC1.class), dc2=of(DC2.class), 
dc3=of(DC3.class), dc4=of(DC4.class), dc5=of(DC5.class);
-
-       @Test
-       public void getBuilderCreateMethod() throws Exception {
-               check("DC1.create()", 
dc1.getBuilderCreateMethod().orElse(null));
-               check(null, dc2.getBuilderCreateMethod().orElse(null));
-               check(null, dc3.getBuilderCreateMethod().orElse(null));
-               check(null, dc4.getBuilderCreateMethod().orElse(null));
-               check(null, dc5.getBuilderCreateMethod().orElse(null));
-       }
-
-       static class DDx {}
-       static class DD1 {
-               public DDx build() {return null;}
-       }
-       static class DD2 {
-               public void build() {}
-       }
-       static class DD3 {
-               public static DDx build() {return null;}
-       }
-       static class DD4 {
-               public DDx build2() {return null;}
-       }
-       static class DD5 {
-               public DDx build(String x) {return null;}
-       }
-       static ClassInfo dd1=of(DD1.class), dd2=of(DD2.class), 
dd3=of(DD3.class), dd4=of(DD4.class), dd5=of(DD5.class);
-
-       @Test
-       public void getBuilderBuildMethod() throws Exception {
-               check("DD1.build()", dd1.getBuilderBuildMethod().orElse(null));
-               check(null, dd2.getBuilderBuildMethod().orElse(null));
-               check(null, dd3.getBuilderBuildMethod().orElse(null));
-               check(null, dd4.getBuilderBuildMethod().orElse(null));
-               check(null, dd5.getBuilderBuildMethod().orElse(null));
-       }
-
-       
//-----------------------------------------------------------------------------------------------------------------
        // Constructors
        
//-----------------------------------------------------------------------------------------------------------------
 
@@ -529,13 +470,12 @@ public class ClassInfoTest {
 
        @Test
        public void getPublicConstructor_classArgs() {
-               check("E1(String)", e1.getPublicConstructor(String.class));
-               check("E1(Writer)", 
e1.getAvailablePublicConstructor(StringWriter.class));
+               check("E1(String)", e1.getPublicConstructor(x -> 
x.hasParamTypes(String.class)));
        }
 
        @Test
        public void getPublicConstructor_objectArgs() {
-               check("E1(String)", e1.getPublicConstructor("foo"));
+               check("E1(String)", e1.getPublicConstructor(x -> 
x.canAccept("foo")));
        }
 
        @Test
@@ -569,17 +509,17 @@ public class ClassInfoTest {
 
        @Test
        public void getPublicNoArgConstructor() {
-               check("E1()", e1.getPublicConstructor());
+               check("E1()", e1.getPublicConstructor(x -> x.hasNoParams()));
        }
 
        @Test
        public void getConstructor() {
-               check("E1(int)", e1.getConstructor(Visibility.PROTECTED, 
int.class));
-               check("E1(int)", e1.getConstructor(Visibility.PRIVATE, 
int.class));
-               check(null, e1.getConstructor(Visibility.PUBLIC, int.class));
-               check("E3()", e3.getConstructor(Visibility.PUBLIC));
-               check(null, e4.getConstructor(Visibility.PUBLIC));
-               check("E5()", e5.getConstructor(Visibility.PUBLIC));
+               check("E1(int)", e1.getConstructor(x -> 
x.isVisible(Visibility.PROTECTED) && x.hasParamTypes(int.class)));
+               check("E1(int)", e1.getConstructor(x -> 
x.isVisible(Visibility.PRIVATE) && x.hasParamTypes(int.class)));
+               check(null, e1.getConstructor(x -> 
x.isVisible(Visibility.PUBLIC) && x.hasParamTypes(int.class)));
+               check("E3()", e3.getConstructor(x -> 
x.isVisible(Visibility.PUBLIC)));
+               check("E4(ClassInfoTest)", e4.getConstructor(x -> 
x.isVisible(Visibility.PUBLIC)));
+               check("E5()", e5.getConstructor(x -> 
x.isVisible(Visibility.PUBLIC)));
        }
 
        
//-----------------------------------------------------------------------------------------------------------------
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/reflection/ConstructorInfoTest.java
 
b/juneau-utest/src/test/java/org/apache/juneau/reflection/ConstructorInfoTest.java
index 859cee4..a7e3e33 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/reflection/ConstructorInfoTest.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/reflection/ConstructorInfoTest.java
@@ -109,10 +109,10 @@ public class ConstructorInfoTest {
        }
        static ClassInfo b = ClassInfo.of(B.class);
        static ConstructorInfo
-               b_c1 = b.getPublicConstructor(),
-               b_c2 = b.getPublicConstructor(String.class),
+               b_c1 = b.getPublicConstructor(x -> x.hasNoParams()),
+               b_c2 = b.getPublicConstructor(x -> 
x.hasParamTypes(String.class)),
                b_c3 = b.getDeclaredConstructor(x -> 
x.hasParamTypes(int.class)),
-               b_c4 = b.getPublicConstructor(String.class, String.class);
+               b_c4 = b.getPublicConstructor(x -> 
x.hasParamTypes(String.class, String.class));
 
 
        @Test
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/reflection/ExecutableInfoTest.java
 
b/juneau-utest/src/test/java/org/apache/juneau/reflection/ExecutableInfoTest.java
index 6a51439..29ce29b 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/reflection/ExecutableInfoTest.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/reflection/ExecutableInfoTest.java
@@ -73,13 +73,13 @@ public class ExecutableInfoTest {
 
        @Test
        public void isConstructor() {
-               assertTrue(a.getPublicConstructor().isConstructor());
+               assertTrue(a.getPublicConstructor(x -> 
x.hasNoParams()).isConstructor());
                assertFalse(a.getPublicMethod(x -> 
x.hasName("foo")).isConstructor());
        }
 
        @Test
        public void getDeclaringClass() {
-               check("A", a.getPublicConstructor().getDeclaringClass());
+               check("A", a.getPublicConstructor(x -> 
x.hasNoParams()).getDeclaringClass());
                check("A", a.getPublicMethod(x -> 
x.hasName("foo")).getDeclaringClass());
        }
 
@@ -95,8 +95,8 @@ public class ExecutableInfoTest {
        }
        static ClassInfo b = ClassInfo.of(B.class);
        static ExecutableInfo
-               b_c1=b.getPublicConstructor(),
-               b_c2=b.getPublicConstructor(String.class),
+               b_c1=b.getPublicConstructor(x -> x.hasNoParams()),
+               b_c2=b.getPublicConstructor(x -> x.hasParamTypes(String.class)),
                b_m1=b.getPublicMethod(x -> x.hasName("m") && x.hasNoParams()),
                b_m2=b.getPublicMethod(x -> x.hasName("m") && 
x.hasParamTypes(String.class))
        ;
@@ -156,7 +156,7 @@ public class ExecutableInfoTest {
        @Test
        public void getParam_nocache() {
                ClassInfo b = ClassInfo.of(B.class);
-               check("B[0]", b.getPublicConstructor(String.class).getParam(0));
+               check("B[0]", b.getPublicConstructor(x -> 
x.hasParamTypes(String.class)).getParam(0));
                check("m[0]", b.getPublicMethod(x -> x.hasName("m") && 
x.hasParamTypes(String.class)).getParam(0));
        }
 
@@ -170,9 +170,9 @@ public class ExecutableInfoTest {
        @Test
        public void getParam_indexOutOfBounds_noCache() {
                ClassInfo b = ClassInfo.of(B.class);
-               
assertThrown(()->b.getPublicConstructor().getParam(0)).message().is("Invalid 
index '0'.  No parameters.");
-               
assertThrown(()->b.getPublicConstructor(String.class).getParam(-1)).message().is("Invalid
 index '-1'.  Parameter count: 1");
-               
assertThrown(()->b.getPublicConstructor(String.class).getParam(1)).message().is("Invalid
 index '1'.  Parameter count: 1");
+               assertThrown(()->b.getPublicConstructor(x -> 
x.hasNoParams()).getParam(0)).message().is("Invalid index '0'.  No 
parameters.");
+               assertThrown(()->b.getPublicConstructor(x -> 
x.hasParamTypes(String.class)).getParam(-1)).message().is("Invalid index '-1'.  
Parameter count: 1");
+               assertThrown(()->b.getPublicConstructor(x -> 
x.hasParamTypes(String.class)).getParam(1)).message().is("Invalid index '1'.  
Parameter count: 1");
        }
 
        @Test
@@ -268,9 +268,9 @@ public class ExecutableInfoTest {
        }
        static ClassInfo c = ClassInfo.of(C.class);
        static ConstructorInfo
-               c_c1=c.getPublicConstructor(),
-               c_c2=c.getPublicConstructor(String.class),
-               c_c3=c.getPublicConstructor(int.class)
+               c_c1=c.getPublicConstructor(x -> x.hasNoParams()),
+               c_c2=c.getPublicConstructor(x -> x.hasParamTypes(String.class)),
+               c_c3=c.getPublicConstructor(x -> x.hasParamTypes(int.class))
        ;
        static MethodInfo
                c_m1=c.getPublicMethod(x -> x.hasName("m") && x.hasNoParams()),
@@ -329,7 +329,7 @@ public class ExecutableInfoTest {
        }
        static ClassInfo d = ClassInfo.of(D.class);
        static ExecutableInfo
-               d_c=d.getPublicConstructor(),
+               d_c=d.getPublicConstructor(x -> x.hasNoParams()),
                d_m=d.getPublicMethod(x -> x.hasName("m"))
        ;
 
@@ -591,9 +591,9 @@ public class ExecutableInfoTest {
 
        @Test
        public void getFullName_constructor() {
-               
assertEquals("org.apache.juneau.reflection.ExecutableInfoTest$X()", 
x.getPublicConstructor().getFullName());
-               
assertEquals("org.apache.juneau.reflection.ExecutableInfoTest$X(java.lang.String)",
 x.getPublicConstructor(String.class).getFullName());
-               
assertEquals("org.apache.juneau.reflection.ExecutableInfoTest$X(java.util.Map<java.lang.String,java.lang.Object>)",
 x.getPublicConstructor(Map.class).getFullName());
+               
assertEquals("org.apache.juneau.reflection.ExecutableInfoTest$X()", 
x.getPublicConstructor(x -> x.hasNoParams()).getFullName());
+               
assertEquals("org.apache.juneau.reflection.ExecutableInfoTest$X(java.lang.String)",
 x.getPublicConstructor(x -> x.hasParamTypes(String.class)).getFullName());
+               
assertEquals("org.apache.juneau.reflection.ExecutableInfoTest$X(java.util.Map<java.lang.String,java.lang.Object>)",
 x.getPublicConstructor(x -> x.hasParamTypes(Map.class)).getFullName());
        }
 
        @Test
@@ -605,9 +605,9 @@ public class ExecutableInfoTest {
 
        @Test
        public void getShortName_constructor() {
-               assertEquals("X()", x.getPublicConstructor().getShortName());
-               assertEquals("X(String)", 
x.getPublicConstructor(String.class).getShortName());
-               assertEquals("X(Map)", 
x.getPublicConstructor(Map.class).getShortName());
+               assertEquals("X()", x.getPublicConstructor(x -> 
x.hasNoParams()).getShortName());
+               assertEquals("X(String)", x.getPublicConstructor(x -> 
x.hasParamTypes(String.class)).getShortName());
+               assertEquals("X(Map)", x.getPublicConstructor(x -> 
x.hasParamTypes(Map.class)).getShortName());
        }
 
        @Test
@@ -619,8 +619,8 @@ public class ExecutableInfoTest {
 
        @Test
        public void getSimpleName_constructor() {
-               assertEquals("X", x.getPublicConstructor().getSimpleName());
-               assertEquals("X", 
x.getPublicConstructor(String.class).getSimpleName());
-               assertEquals("X", 
x.getPublicConstructor(Map.class).getSimpleName());
+               assertEquals("X", x.getPublicConstructor(x -> 
x.hasNoParams()).getSimpleName());
+               assertEquals("X", x.getPublicConstructor(x -> 
x.hasParamTypes(String.class)).getSimpleName());
+               assertEquals("X", x.getPublicConstructor(x -> 
x.hasParamTypes(Map.class)).getSimpleName());
        }
 }
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/reflection/ParamInfoTest.java 
b/juneau-utest/src/test/java/org/apache/juneau/reflection/ParamInfoTest.java
index 0cd1073..a804655 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/reflection/ParamInfoTest.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/reflection/ParamInfoTest.java
@@ -86,8 +86,8 @@ public class ParamInfoTest {
 
        static ClassInfo b = ClassInfo.of(B.class);
        static ParamInfo
-               b_b_a = b.getPublicConstructor(int.class, 
String.class).getParam(0),
-               b_b_b = b.getPublicConstructor(int.class, 
String.class).getParam(1),
+               b_b_a = b.getPublicConstructor(x -> x.hasParamTypes(int.class, 
String.class)).getParam(0),
+               b_b_b = b.getPublicConstructor(x -> x.hasParamTypes(int.class, 
String.class)).getParam(1),
                b_a1_a = b.getMethod(x -> x.hasName("a1")).getParam(0),
                b_a1_b = b.getMethod(x -> x.hasName("a1")).getParam(1),
                b_a2_a = b.getMethod(x -> x.hasName("a2")).getParam(0),
@@ -172,7 +172,7 @@ public class ParamInfoTest {
                cb = ClassInfo.of(CB.class),
                cc = ClassInfo.of(CC.class);
        static ParamInfo
-               cc_cc = cc.getPublicConstructor(C1.class).getParam(0),
+               cc_cc = cc.getPublicConstructor(x -> 
x.hasParamTypes(C1.class)).getParam(0),
                cb_a1 = cb.getMethod(x -> x.hasName("a1")).getParam(0),
                cb_a2 = cb.getMethod(x -> x.hasName("a2")).getParam(0),
                cc_a1 = cc.getMethod(x -> x.hasName("a1")).getParam(0),

Reply via email to