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 fbfd9ae76a New BeanCreator API
fbfd9ae76a is described below

commit fbfd9ae76aabdccbdd8c2bf579e7fa036759de37
Author: James Bognar <[email protected]>
AuthorDate: Wed Jan 21 12:38:41 2026 -0500

    New BeanCreator API
---
 .../juneau/assertions/FluentObjectAssertion.java   |   2 +-
 .../apache/juneau/commons/reflect/ClassInfo.java   | 126 +++++++++++++--
 .../apache/juneau/commons/reflect/MethodInfo.java  |  16 +-
 .../apache/juneau/commons/utils/ClassUtils.java    |   2 +-
 .../main/java/org/apache/juneau/BeanContext.java   |   6 +-
 .../src/main/java/org/apache/juneau/BeanMeta.java  |  18 +--
 .../java/org/apache/juneau/BeanPropertyMeta.java   |  20 +--
 .../main/java/org/apache/juneau/BeanRegistry.java  |   4 +-
 .../main/java/org/apache/juneau/BeanSession.java   |   6 +-
 .../src/main/java/org/apache/juneau/ClassMeta.java |  46 +++---
 .../src/main/java/org/apache/juneau/Context.java   |   2 +-
 .../org/apache/juneau/collections/JsonMap.java     |   2 +-
 .../org/apache/juneau/internal/ClassUtils2.java    |   2 +-
 .../jsonschema/JsonSchemaGeneratorSession.java     |   4 +-
 .../juneau/serializer/SerializerSession.java       |   4 +-
 .../org/apache/juneau/swap/AutoNumberSwap.java     |   4 +-
 .../java/org/apache/juneau/swap/BuilderSwap.java   |   2 +-
 .../java/org/apache/juneau/swap/ObjectSwap.java    |   4 +-
 .../microservice/jetty/JettyMicroservice.java      |   4 +-
 .../org/apache/juneau/rest/client/RestClient.java  |   4 +-
 .../java/org/apache/juneau/http/HttpHeaders.java   |   2 +-
 .../java/org/apache/juneau/http/HttpParts.java     |   6 +-
 .../org/apache/juneau/http/part/BasicPart.java     |   2 +-
 .../java/org/apache/juneau/rest/RestContext.java   |   2 +-
 .../juneau/commons/reflect/ClassInfo_Test.java     | 178 +++++++++++++--------
 .../client/RestClient_Config_RestClient_Test.java  |   2 +-
 26 files changed, 310 insertions(+), 160 deletions(-)

diff --git 
a/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentObjectAssertion.java
 
b/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentObjectAssertion.java
index 8da62f289f..cd4ec38ba7 100644
--- 
a/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentObjectAssertion.java
+++ 
b/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentObjectAssertion.java
@@ -504,7 +504,7 @@ public class FluentObjectAssertion<T,R> extends 
FluentAssertion<R> {
         */
        public R isType(Class<?> parent) throws AssertionError {
                assertArgNotNull("parent", parent);
-               if (! info(value()).isChildOf(parent))
+               if (! info(value()).isAssignableTo(parent))
                        throw error(MSG_unexpectedType, cn(parent), cn(value));
                return returns();
        }
diff --git 
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/reflect/ClassInfo.java
 
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/reflect/ClassInfo.java
index 60fbd14a98..1d7af58f8f 100644
--- 
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/reflect/ClassInfo.java
+++ 
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/reflect/ClassInfo.java
@@ -461,7 +461,7 @@ public class ClassInfo extends ElementInfo implements 
Annotatable, Type, Compara
                if (inner.isInstance(child))
                        return true;
                if (this.isPrimitive())
-                       return 
this.getWrapperIfPrimitive().isParentOf(of(child).getWrapperIfPrimitive());
+                       return 
this.getWrapperIfPrimitive().isAssignableFrom(of(child).getWrapperIfPrimitive());
                return false;
        }
 
@@ -2010,18 +2010,65 @@ public class ClassInfo extends ElementInfo implements 
Annotatable, Type, Compara
         * @param parent The parent class.
         * @return <jk>true</jk> if this class is a child or the same as 
<c>parent</c>.
         */
-       public boolean isChildOf(Class<?> parent) {
+       public boolean isAssignableTo(Class<?> parent) {
                return and(nn(inner), nn(parent)) && 
parent.isAssignableFrom(inner);
        }
 
+       /**
+        * Returns <jk>true</jk> if this class is strictly a child of 
<c>parent</c> (not the same class).
+        *
+        * <p>
+        * This method returns <jk>true</jk> only if this class is a child of 
the parent class,
+        * excluding the case where they are the same class.
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bjava'>
+        *      ClassInfo <jv>child</jv> = 
ClassInfo.<jsm>of</jsm>(ArrayList.<jk>class</jk>);
+        *      ClassInfo <jv>parent</jv> = 
ClassInfo.<jsm>of</jsm>(List.<jk>class</jk>);
+        *      <jk>boolean</jk> <jv>b1</jv> = 
<jv>child</jv>.isChildOf(List.<jk>class</jk>);  <jc>// true</jc>
+        *      <jk>boolean</jk> <jv>b2</jv> = 
<jv>child</jv>.isChildOf(ArrayList.<jk>class</jk>);  <jc>// false (same 
class)</jc>
+        * </p>
+        *
+        * @param parent The parent class.
+        * @return <jk>true</jk> if this class is strictly a child of 
<c>parent</c>.
+        */
+       public boolean isChildOf(Class<?> parent) {
+               return and(nn(inner), nn(parent)) && neq(inner, parent) && 
parent.isAssignableFrom(inner);
+       }
+
+       /**
+        * Returns <jk>true</jk> if this class is strictly a child of 
<c>parent</c> (not the same class).
+        *
+        * <p>
+        * Same as {@link #isChildOf(Class)} but takes in a {@link ClassInfo}.
+        *
+        * @param parent The parent class.
+        * @return <jk>true</jk> if this class is strictly a child of 
<c>parent</c>.
+        */
+       public boolean isChildOf(ClassInfo parent) {
+               return and(nn(inner), nn(parent)) && neq(inner, parent.inner()) 
&& parent.inner().isAssignableFrom(inner);
+       }
+
+       /**
+        * Returns <jk>true</jk> if this class is strictly a child of 
<c>parent</c> (not the same class).
+        *
+        * @param parent The parent class.
+        * @return <jk>true</jk> if this class is strictly a child of 
<c>parent</c>.
+        */
+       public boolean isChildOf(Type parent) {
+               if (parent instanceof Class<?> c)
+                       return isChildOf(c);
+               return false;
+       }
+
        /**
         * Returns <jk>true</jk> if this class is a child or the same as 
<c>parent</c>.
         *
         * @param parent The parent class.
         * @return <jk>true</jk> if this class is a parent or the same as 
<c>parent</c>.
         */
-       public boolean isChildOf(ClassInfo parent) {
-               return isChildOf(parent.inner());
+       public boolean isAssignableTo(ClassInfo parent) {
+               return isAssignableTo(parent.inner());
        }
 
        /**
@@ -2030,9 +2077,9 @@ public class ClassInfo extends ElementInfo implements 
Annotatable, Type, Compara
         * @param parent The parent class.
         * @return <jk>true</jk> if this class is a parent or the same as 
<c>parent</c>.
         */
-       public boolean isChildOf(Type parent) {
+       public boolean isAssignableTo(Type parent) {
                if (parent instanceof Class<?> c)
-                       return isChildOf(c);
+                       return isAssignableTo(c);
                return false;
        }
 
@@ -2042,9 +2089,9 @@ public class ClassInfo extends ElementInfo implements 
Annotatable, Type, Compara
         * @param parents The parents class.
         * @return <jk>true</jk> if this class is a child or the same as any of 
the <c>parents</c>.
         */
-       public boolean isChildOfAny(Class<?>...parents) {
+       public boolean isAssignableToAny(Class<?>...parents) {
                for (var p : parents)
-                       if (isChildOf(p))
+                       if (isAssignableTo(p))
                                return true;
                return false;
        }
@@ -2180,16 +2227,63 @@ public class ClassInfo extends ElementInfo implements 
Annotatable, Type, Compara
         * @param child The child class.
         * @return <jk>true</jk> if this class is a parent or the same as 
<c>child</c>.
         */
-       public boolean isParentOf(Class<?> child) {
+       public boolean isAssignableFrom(Class<?> child) {
                return nn(inner) && nn(child) && inner.isAssignableFrom(child);
        }
 
        /**
-        * Returns <jk>true</jk> if this class is a parent or the same as 
<c>child</c>.
+        * Returns <jk>true</jk> if this class is strictly a parent of 
<c>child</c> (not the same class).
+        *
+        * <p>
+        * This method returns <jk>true</jk> only if this class is a parent of 
the child class,
+        * excluding the case where they are the same class.
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bjava'>
+        *      ClassInfo <jv>parent</jv> = 
ClassInfo.<jsm>of</jsm>(List.<jk>class</jk>);
+        *      ClassInfo <jv>child</jv> = 
ClassInfo.<jsm>of</jsm>(ArrayList.<jk>class</jk>);
+        *      <jk>boolean</jk> <jv>b1</jv> = 
<jv>parent</jv>.isParentOf(ArrayList.<jk>class</jk>);  <jc>// true</jc>
+        *      <jk>boolean</jk> <jv>b2</jv> = 
<jv>parent</jv>.isParentOf(List.<jk>class</jk>);  <jc>// false (same class)</jc>
+        * </p>
+        *
+        * @param child The child class.
+        * @return <jk>true</jk> if this class is strictly a parent of 
<c>child</c>.
+        */
+       public boolean isParentOf(Class<?> child) {
+               return nn(inner) && nn(child) && neq(inner, child) && 
inner.isAssignableFrom(child);
+       }
+
+       /**
+        * Returns <jk>true</jk> if this class is strictly a parent of 
<c>child</c> (not the same class).
         *
         * <p>
         * Same as {@link #isParentOf(Class)} but takes in a {@link ClassInfo}.
         *
+        * @param child The child class.
+        * @return <jk>true</jk> if this class is strictly a parent of 
<c>child</c>.
+        */
+       public boolean isParentOf(ClassInfo child) {
+               return nn(inner) && nn(child) && neq(inner, child.inner()) && 
inner.isAssignableFrom(child.inner());
+       }
+
+       /**
+        * Returns <jk>true</jk> if this class is strictly a parent of 
<c>child</c> (not the same class).
+        *
+        * @param child The child class.
+        * @return <jk>true</jk> if this class is strictly a parent of 
<c>child</c>.
+        */
+       public boolean isParentOf(Type child) {
+               if (child instanceof Class<?> c)
+                       return isParentOf(c);
+               return false;
+       }
+
+       /**
+        * Returns <jk>true</jk> if this class is a parent or the same as 
<c>child</c>.
+        *
+        * <p>
+        * Same as {@link #isAssignableFrom(Class)} but takes in a {@link 
ClassInfo}.
+        *
         * <h5 class='section'>Example:</h5>
         * <p class='bjava'>
         *      ClassInfo <jv>parent</jv> = 
ClassInfo.<jsm>of</jsm>(List.<jk>class</jk>);
@@ -2200,7 +2294,7 @@ public class ClassInfo extends ElementInfo implements 
Annotatable, Type, Compara
         * @param child The child class.
         * @return <jk>true</jk> if this class is a parent or the same as 
<c>child</c>.
         */
-       public boolean isParentOf(ClassInfo child) {
+       public boolean isAssignableFrom(ClassInfo child) {
                return nn(inner) && nn(child) && 
inner.isAssignableFrom(child.inner());
        }
 
@@ -2210,9 +2304,9 @@ public class ClassInfo extends ElementInfo implements 
Annotatable, Type, Compara
         * @param child The child class.
         * @return <jk>true</jk> if this class is a parent or the same as 
<c>child</c>.
         */
-       public boolean isParentOf(Type child) {
+       public boolean isAssignableFrom(Type child) {
                if (child instanceof Class<?> c)
-                       return isParentOf(c);
+                       return isAssignableFrom(c);
                return false;
        }
 
@@ -2243,7 +2337,7 @@ public class ClassInfo extends ElementInfo implements 
Annotatable, Type, Compara
                if (inner.isAssignableFrom(child))
                        return true;
                if (this.isPrimitive() || child.isPrimitive()) {
-                       return 
this.getWrapperIfPrimitive().isParentOf(of(child).getWrapperIfPrimitive());
+                       return 
this.getWrapperIfPrimitive().isAssignableFrom(of(child).getWrapperIfPrimitive());
                }
                return false;
        }
@@ -2263,7 +2357,7 @@ public class ClassInfo extends ElementInfo implements 
Annotatable, Type, Compara
                // Note: If both are primitives and the same type, we would 
have returned true above
                // So this branch is only reached when at least one is a 
primitive and they're not directly assignable
                if (this.isPrimitive() || child.isPrimitive()) {
-                       return 
this.getWrapperIfPrimitive().isParentOf(child.getWrapperIfPrimitive());
+                       return 
this.getWrapperIfPrimitive().isAssignableFrom(child.getWrapperIfPrimitive());
                }
                return false;
        }
@@ -2314,7 +2408,7 @@ public class ClassInfo extends ElementInfo implements 
Annotatable, Type, Compara
         *
         * @return <jk>true</jk> if this class is a {@link RuntimeException}.
         */
-       public boolean isRuntimeException() { return 
isChildOf(RuntimeException.class); }
+       public boolean isRuntimeException() { return 
isAssignableTo(RuntimeException.class); }
 
        /**
         * Returns <jk>true</jk> if this class is a sealed class.
diff --git 
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/reflect/MethodInfo.java
 
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/reflect/MethodInfo.java
index b01fabdf56..b3b18938b9 100644
--- 
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/reflect/MethodInfo.java
+++ 
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/reflect/MethodInfo.java
@@ -182,6 +182,20 @@ public class MethodInfo extends ExecutableInfo implements 
Comparable<MethodInfo>
                                }
                        }
                }
+               // Tie-breaker: if methods have same name and parameters (e.g., 
overridden methods),
+               // prefer methods from child classes over parent classes
+               // This ensures consistent ordering and that child methods 
(with covariant return types) come first
+               if (i == 0) {
+                       var declaringClass = getDeclaringClass();
+                       var oDeclaringClass = o.getDeclaringClass();
+                       if (declaringClass.isParentOf(oDeclaringClass)) {
+                               i = -1; // This method is from a child class, 
so it comes first
+                       } else if (oDeclaringClass.isParentOf(declaringClass)) {
+                               i = 1; // Other method is from a child class, 
so it comes first
+                       } else {
+                               i = cmp(declaringClass.getName(), 
oDeclaringClass.getName()); // Neither is a child of the other, compare by 
class name for deterministic ordering
+                       }
+               }
                return i;
        }
 
@@ -531,7 +545,7 @@ public class MethodInfo extends ExecutableInfo implements 
Comparable<MethodInfo>
         * @return <jk>true</jk> if this method has this parent return type.
         */
        public boolean hasReturnTypeParent(Class<?> c) {
-               return ClassInfo.of(c).isParentOf(inner.getReturnType());
+               return ClassInfo.of(c).isAssignableFrom(inner.getReturnType());
        }
 
        /**
diff --git 
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/ClassUtils.java
 
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/ClassUtils.java
index bb6c2f4a6a..64314e8f00 100644
--- 
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/ClassUtils.java
+++ 
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/ClassUtils.java
@@ -353,7 +353,7 @@ public class ClassUtils {
                for (var i = 0; i < paramTypes.length; i++) {
                        var pt = info(paramTypes[i]).getWrapperIfPrimitive();
                        for (var arg : args) {
-                               if (nn(arg) && pt.isParentOf(arg.getClass())) {
+                               if (nn(arg) && 
pt.isAssignableFrom(arg.getClass())) {
                                        params[i] = arg;
                                        break;
                                }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java
index 4a508d6270..a161335301 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java
@@ -3676,9 +3676,9 @@ public class BeanContext extends Context {
                                _objectSwaps.add(os);
                        } else {
                                var ci = info((Class<?>)x);
-                               if (ci.isChildOf(ObjectSwap.class))
+                               if (ci.isAssignableTo(ObjectSwap.class))
                                        
_objectSwaps.add(BeanCreator.of(ObjectSwap.class).type(ci).run());
-                               else if (ci.isChildOf(Surrogate.class))
+                               else if (ci.isAssignableTo(Surrogate.class))
                                        
_objectSwaps.addAll(SurrogateSwap.findObjectSwaps(ci.inner(), this));
                                else
                                        throw rex("Invalid class {0} specified 
in BeanContext.swaps property.  Must be a subclass of ObjectSwap or 
Surrogate.", cn(ci.inner()));
@@ -4258,7 +4258,7 @@ public class BeanContext extends Context {
                                        return true;
                }
                for (var exclude : notBeanClasses)
-                       if (ci.isChildOf(exclude))
+                       if (ci.isAssignableTo(exclude))
                                return true;
                return false;
        }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
index ff3aacc256..a463f0c192 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
@@ -132,7 +132,7 @@ public class BeanMeta<T> {
                                return true;
 
                        // Doesn't match if not same type or super type as 
getter/field.
-                       if (! type.isParentOf(pt))
+                       if (! type.isAssignableFrom(pt))
                                return false;
 
                        // If a setter was previously set, only use this setter 
if it's a closer
@@ -212,7 +212,7 @@ public class BeanMeta<T> {
                        if (bc.isNotABean(cm))
                                return notABean("Class matches exclude-class 
list");
 
-                       if (bc.isBeansRequireSerializable() && ! 
cm.isChildOf(Serializable.class) && ! ap.has(Bean.class, cm))
+                       if (bc.isBeansRequireSerializable() && ! 
cm.isAssignableTo(Serializable.class) && ! ap.has(Bean.class, cm))
                                return notABean("Class is not serializable");
 
                        if (ap.has(BeanIgnore.class, cm))
@@ -1093,9 +1093,9 @@ public class BeanMeta<T> {
 
                                if (params.isEmpty()) {
                                        if ("*".equals(bpName)) {
-                                               if 
(rt.isChildOf(Collection.class)) {
+                                               if 
(rt.isAssignableTo(Collection.class)) {
                                                        methodType = EXTRAKEYS;
-                                               } else if 
(rt.isChildOf(Map.class)) {
+                                               } else if 
(rt.isAssignableTo(Map.class)) {
                                                        methodType = GETTER;
                                                }
                                                n = bpName;
@@ -1119,17 +1119,17 @@ public class BeanMeta<T> {
                                        }
                                } else if (params.size() == 1) {
                                        if ("*".equals(bpName)) {
-                                               if 
(params.get(0).getParameterType().isChildOf(Map.class)) {
+                                               if 
(params.get(0).getParameterType().isAssignableTo(Map.class)) {
                                                        methodType = SETTER;
                                                        n = bpName;
                                                } else if 
(params.get(0).getParameterType().is(String.class)) {
                                                        methodType = GETTER;
                                                        n = bpName;
                                                }
-                                       } else if (n.startsWith("set") && 
(rt.isParentOf(ci) || rt.is(Void.TYPE))) {
+                                       } else if (n.startsWith("set") && 
(rt.isAssignableFrom(ci) || rt.is(Void.TYPE))) {
                                                methodType = SETTER;
                                                n = n.substring(3);
-                                       } else if (n.startsWith("with") && 
(rt.isParentOf(ci))) {
+                                       } else if (n.startsWith("with") && 
(rt.isAssignableFrom(ci))) {
                                                methodType = SETTER;
                                                n = n.substring(4);
                                        } else if (nn(bpName)) {
@@ -1141,12 +1141,12 @@ public class BeanMeta<T> {
                                                } else {
                                                        n = bpName;
                                                }
-                                       } else if (fluentSetters && 
rt.isParentOf(ci)) {
+                                       } else if (fluentSetters && 
rt.isAssignableFrom(ci)) {
                                                methodType = SETTER;
                                        }
                                } else if (params.size() == 2) {
                                        if ("*".equals(bpName) && 
params.get(0).getParameterType().is(String.class)) {
-                                               if (n.startsWith("set") && 
(rt.isParentOf(ci) || rt.is(Void.TYPE))) {
+                                               if (n.startsWith("set") && 
(rt.isAssignableFrom(ci) || rt.is(Void.TYPE))) {
                                                        methodType = SETTER;
                                                } else {
                                                        methodType = GETTER;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
index 27db36e58e..d80e46a925 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
@@ -154,7 +154,7 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                        if (isVoid(c))
                                return null;
                        var ci = info(c);
-                       if (ci.isChildOf(ObjectSwap.class)) {
+                       if (ci.isAssignableTo(ObjectSwap.class)) {
                                var ps = 
BeanCreator.of(ObjectSwap.class).type(ci).run();
                                if (nn(ps.forMediaTypes()))
                                        throw unsupportedOp("TODO - Media types 
on swaps not yet supported on bean properties.");
@@ -162,7 +162,7 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                                        throw unsupportedOp("TODO - Templates 
on swaps not yet supported on bean properties.");
                                return ps;
                        }
-                       if (ci.isChildOf(Surrogate.class))
+                       if (ci.isAssignableTo(Surrogate.class))
                                throw unsupportedOp("TODO - Surrogate swaps not 
yet supported on bean properties.");
                        throw rex("Invalid class used in @Swap annotation.  
Must be a subclass of ObjectSwap or Surrogate. {0}", cn(c));
                }
@@ -362,7 +362,7 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                        if (nn(getter)) {
                                var pt = getter.getParameterTypes();
                                if (isDyna) {
-                                       if (ci.isChildOf(Map.class) && e(pt)) {
+                                       if (ci.isAssignableTo(Map.class) && 
e(pt)) {
                                                isDynaGetterMap = true;
                                        } else if (pt.size() == 1 && 
pt.get(0).is(String.class)) {
                                                // OK.
@@ -370,7 +370,7 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                                                return false;
                                        }
                                } else {
-                                       if (! 
ci.isChildOf(getter.getReturnType()))
+                                       if (! 
ci.isAssignableTo(getter.getReturnType()))
                                                return false;
                                }
                        }
@@ -383,16 +383,16 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                                                return false;
                                        }
                                } else {
-                                       if (pt.size() != 1 || ! 
ci.isChildOf(pt.get(0).inner()))
+                                       if (pt.size() != 1 || ! 
ci.isAssignableTo(pt.get(0).inner()))
                                                return false;
                                }
                        }
                        if (nn(field)) {
                                if (isDyna) {
-                                       if (! 
field.getFieldType().isChildOf(Map.class))
+                                       if (! 
field.getFieldType().isAssignableTo(Map.class))
                                                return false;
                                } else {
-                                       if (! 
ci.isChildOf(field.getFieldType()))
+                                       if (! 
ci.isAssignableTo(field.getFieldType()))
                                                return false;
                                }
                        }
@@ -999,7 +999,7 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
 
                                var vc = value1 == null ? null : 
value1.getClass();
 
-                               if (isMap && (setter == null || ! 
pcInfo.isParentOf(vc))) {
+                               if (isMap && (setter == null || ! 
pcInfo.isAssignableFrom(vc))) {
 
                                        if (! (value1 instanceof Map)) {
                                                if (value1 instanceof 
CharSequence value21)
@@ -1057,7 +1057,7 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                                        if (nn(setter) || nn(field))
                                                invokeSetter(bean, pName, 
propMap);
 
-                               } else if (isCollection && (setter == null || ! 
pcInfo.isParentOf(vc))) {
+                               } else if (isCollection && (setter == null || ! 
pcInfo.isAssignableFrom(vc))) {
 
                                        if (! (value1 instanceof Collection)) {
                                                if (value1 instanceof 
CharSequence value2)
@@ -1116,7 +1116,7 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                                        });
 
                                } else {
-                                       if (nn(swap) && value1 != null && 
swap.getSwapClass().isParentOf(value1.getClass())) {
+                                       if (nn(swap) && value1 != null && 
swap.getSwapClass().isAssignableFrom(value1.getClass())) {
                                                value1 = swap.unswap(session, 
value1, rawTypeMeta);
                                        } else {
                                                value1 = 
session.convertToType(value1, rawTypeMeta);
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanRegistry.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanRegistry.java
index df74e20152..603eea18b2 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanRegistry.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanRegistry.java
@@ -132,7 +132,7 @@ public class BeanRegistry {
        private void addClass(ClassInfo ci) {
                try {
                        if (nn(ci) && nn(ci.inner())) {
-                               if (ci.isChildOf(Collection.class)) {
+                               if (ci.isAssignableTo(Collection.class)) {
                                        Collection<?> cc = 
BeanCreator.of(Collection.class).type(ci).run();
                                        cc.forEach(x -> {
                                                if (x instanceof Class<?> x2)
@@ -140,7 +140,7 @@ public class BeanRegistry {
                                                else
                                                        throw bex("Collection 
class ''{0}'' passed to BeanRegistry does not contain Class objects.", 
ci.getName());
                                        });
-                               } else if (ci.isChildOf(Map.class)) {
+                               } else if (ci.isAssignableTo(Map.class)) {
                                        Map<?,?> m = 
BeanCreator.of(Map.class).type(ci).run();
                                        m.forEach((k, v) -> {
                                                var typeName = s(k);
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSession.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSession.java
index 9468f513af..3f2032393c 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSession.java
@@ -1173,7 +1173,7 @@ public class BeanSession extends ContextSession {
                        if (nn(swap)) {
                                var nc = swap.getNormalClass();
                                var fc = swap.getSwapClass();
-                               if (nc.isParentOf(tc) && 
fc.isParentOf(value.getClass()))
+                               if (nc.isAssignableFrom(tc) && 
fc.isAssignableFrom(value.getClass()))
                                        return (T)swap.unswap(this, value, to);
                                var fcm = getClassMeta(fc);
                                if (fcm.isNumber() && value instanceof Number 
value2) {
@@ -1187,7 +1187,7 @@ public class BeanSession extends ContextSession {
                        if (nn(swap)) {
                                var nc = swap.getNormalClass();
                                var fc = swap.getSwapClass();
-                               if (nc.isParentOf(from.inner()) && 
fc.isParentOf(tc))
+                               if (nc.isAssignableFrom(from.inner()) && 
fc.isAssignableFrom(tc))
                                        return (T)swap.swap(this, value);
                        }
 
@@ -1494,7 +1494,7 @@ public class BeanSession extends ContextSession {
                                        var typeName = 
m2.getString(getBeanTypePropertyName(to));
                                        if (nn(typeName)) {
                                                var cm = 
to.getBeanRegistry().getClassMeta(typeName);
-                                               if (nn(cm) && 
to.isParentOf(cm.inner()))
+                                               if (nn(cm) && 
to.isAssignableFrom(cm.inner()))
                                                        return (T)m2.cast(cm);
                                        }
                                }
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 3b2b9b106d..bdf6998617 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
@@ -190,48 +190,48 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
 
                var ap = beanContext.getAnnotationProvider();
 
-               if (isChildOf(Delegate.class)) {
+               if (isAssignableTo(Delegate.class)) {
                        cat.set(DELEGATE);
                }
                if (isEnum()) {
                        cat.set(ENUM);
-               } else if (isChildOf(CharSequence.class)) {
+               } else if (isAssignableTo(CharSequence.class)) {
                        cat.set(CHARSEQ);
                        if (is(String.class)) {
                                cat.set(STR);
                        }
-               } else if (isChildOf(Number.class) || isAny(byte.class, 
short.class, int.class, long.class, float.class, double.class)) {
+               } else if (isAssignableTo(Number.class) || isAny(byte.class, 
short.class, int.class, long.class, float.class, double.class)) {
                        cat.set(NUMBER);
-                       if (isChildOfAny(Float.class, Double.class) || 
isAny(float.class, double.class)) {
+                       if (isAssignableToAny(Float.class, Double.class) || 
isAny(float.class, double.class)) {
                                cat.set(DECIMAL);
                        }
-               } else if (isChildOf(Collection.class)) {
+               } else if (isAssignableTo(Collection.class)) {
                        cat.set(COLLECTION);
-                       if (isChildOf(Set.class)) {
+                       if (isAssignableTo(Set.class)) {
                                cat.set(SET);
-                       } else if (isChildOf(List.class)) {
+                       } else if (isAssignableTo(List.class)) {
                                cat.set(LIST);
                        }
-               } else if (isChildOf(Map.class)) {
+               } else if (isAssignableTo(Map.class)) {
                        cat.set(MAP);
-                       if (isChildOf(BeanMap.class)) {
+                       if (isAssignableTo(BeanMap.class)) {
                                cat.set(BEANMAP);
                        }
-               } else if (isChildOfAny(Date.class, Calendar.class)) {
-                       if (isChildOf(Date.class)) {
+               } else if (isAssignableToAny(Date.class, Calendar.class)) {
+                       if (isAssignableTo(Date.class)) {
                                cat.set(DATE);
-                       } else if (isChildOf(Calendar.class)) {
+                       } else if (isAssignableTo(Calendar.class)) {
                                cat.set(CALENDAR);
                        }
-               } else if (isChildOf(Temporal.class)) {
+               } else if (isAssignableTo(Temporal.class)) {
                        cat.set(TEMPORAL);
                } else if (inner().isArray()) {
                        cat.set(ARRAY);
-               } else if (isChildOfAny(URL.class, URI.class) || 
ap.has(Uri.class, this)) {
+               } else if (isAssignableToAny(URL.class, URI.class) || 
ap.has(Uri.class, this)) {
                        cat.set(URI);
-               } else if (isChildOf(Reader.class)) {
+               } else if (isAssignableTo(Reader.class)) {
                        cat.set(READER);
-               } else if (isChildOf(InputStream.class)) {
+               } else if (isAssignableTo(InputStream.class)) {
                        cat.set(INPUTSTREAM);
                }
 
@@ -262,11 +262,11 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
        }
 
        protected ObjectSwap<?,?> findSwap(Class<?> c) {
-               return childSwaps.get().stream().filter(x -> 
x.getNormalClass().isParentOf(c)).findFirst().orElse(null);
+               return childSwaps.get().stream().filter(x -> 
x.getNormalClass().isAssignableFrom(c)).findFirst().orElse(null);
        }
 
        protected ObjectSwap<?,?> findUnswap(Class<?> c) {
-               return childSwaps.get().stream().filter(x -> 
x.getSwapClass().isParentOf(c)).findFirst().orElse(null);
+               return childSwaps.get().stream().filter(x -> 
x.getSwapClass().isAssignableFrom(c)).findFirst().orElse(null);
        }
 
 
@@ -1273,7 +1273,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
                        c = s.impl();
                var ci = info(c);
 
-               if (ci.isChildOf(ObjectSwap.class)) {
+               if (ci.isAssignableTo(ObjectSwap.class)) {
                        var ps = 
BeanCreator.of(ObjectSwap.class).type(ci).run();
                        if (s.mediaTypes().length > 0)
                                
ps.forMediaTypes(MediaType.ofAll(s.mediaTypes()));
@@ -1282,7 +1282,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
                        return ps;
                }
 
-               if (ci.isChildOf(Surrogate.class)) {
+               if (ci.isAssignableTo(Surrogate.class)) {
                        List<SurrogateSwap<?,?>> l = 
SurrogateSwap.findObjectSwaps(c, beanContext);
                        if (! l.isEmpty())
                                return (ObjectSwap<T,?>)l.iterator().next();
@@ -1362,7 +1362,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
                if (! swapArray.isEmpty()) {
                        var innerClass = inner();
                        for (var f : swapArray)
-                               if (f.getNormalClass().isParentOf(innerClass))
+                               if 
(f.getNormalClass().isAssignableFrom(innerClass))
                                        list.add((ObjectSwap<T,?>)f);
                }
 
@@ -1393,7 +1393,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
                var list = new ArrayList<ObjectSwap<?,?>>();
                var innerClass = inner();
                for (var f : swapArray)
-                       if (f.getNormalClass().isChildOf(innerClass))
+                       if (f.getNormalClass().isAssignableTo(innerClass))
                                list.add(f);
                return u(list);
        }
@@ -1447,7 +1447,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
 
                return getDeclaredFields()
                        .stream()
-                       .filter(x -> x.isStatic() && 
isParentOf(x.getFieldType()) && ap.has(Example.class, x))
+                       .filter(x -> x.isStatic() && 
isAssignableFrom(x.getFieldType()) && ap.has(Example.class, x))
                        .map(x -> x.accessible())
                        .findFirst()
                        .orElse(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 5c8825d9ce..b77f27b50b 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
@@ -779,7 +779,7 @@ public abstract class Context {
                        var ct = info(cacheType);
                        var bt = info(builderType);
                        return ct
-                               .getPublicConstructor(x -> 
x.hasNumParameters(1) && 
x.getParameter(0).getParameterType().isParentOf(builderType))
+                               .getPublicConstructor(x -> 
x.hasNumParameters(1) && 
x.getParameter(0).getParameterType().isAssignableFrom(builderType))
                                .orElseThrow(() -> rex("Public constructor not 
found: {0}({1})", ct.getName(), bt.getName()));
                })
                .build();
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/collections/JsonMap.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/collections/JsonMap.java
index 5452817792..659ed8249d 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/collections/JsonMap.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/collections/JsonMap.java
@@ -292,7 +292,7 @@ public class JsonMap extends LinkedHashMap<String,Object> {
         * Otherwise, returns c2.
         */
        private static ClassMeta<?> getNarrowedClassMeta(ClassMeta<?> c1, 
ClassMeta<?> c2) {
-               if (c2 == null || c2.isParentOf(c1.inner()))
+               if (c2 == null || c2.isAssignableFrom(c1.inner()))
                        return c1;
                return c2;
        }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ClassUtils2.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ClassUtils2.java
index eebf21a9dc..cd25dd7f28 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ClassUtils2.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ClassUtils2.java
@@ -51,7 +51,7 @@ public class ClassUtils2 {
                for (var i = 0; i < paramTypes.length; i++) {
                        var pt = info(paramTypes[i]).getWrapperIfPrimitive();
                        for (var arg : args) {
-                               if (nn(arg) && pt.isParentOf(arg.getClass())) {
+                               if (nn(arg) && 
pt.isAssignableFrom(arg.getClass())) {
                                        params[i] = arg;
                                        break;
                                }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorSession.java
index a678cb7ade..78ff9a9624 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorSession.java
@@ -430,13 +430,13 @@ public class JsonSchemaGeneratorSession extends 
BeanTraverseSession {
 
                        } else if (tc == COLLECTION) {
                                ClassMeta et = sType.getElementType();
-                               if (sType.isCollection() && 
sType.isChildOf(Set.class))
+                               if (sType.isCollection() && 
sType.isAssignableTo(Set.class))
                                        out.put("uniqueItems", true);
                                out.put("items", getSchema(et, "items", pNames, 
exampleAdded, descriptionAdded, null));
 
                        } else if (tc == ARRAY) {
                                ClassMeta et = sType.getElementType();
-                               if (sType.isCollection() && 
sType.isChildOf(Set.class))
+                               if (sType.isCollection() && 
sType.isAssignableTo(Set.class))
                                        out.put("uniqueItems", true);
                                out.put("items", getSchema(et, "items", pNames, 
exampleAdded, descriptionAdded, null));
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
index b62cbe2620..bbff0e3f9d 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
@@ -367,14 +367,14 @@ public class SerializerSession extends 
BeanTraverseSession {
                                if (((Object[])value).length == 0)
                                        return true;
                        }
-                       if (cm.isCollection() || (cm.isObject() && 
info(value).isChildOf(Collection.class))) {
+                       if (cm.isCollection() || (cm.isObject() && 
info(value).isAssignableTo(Collection.class))) {
                                if (((Collection<?>)value).isEmpty())
                                        return true;
                        }
                }
 
                if (isTrimEmptyMaps()) {
-                       if (cm.isMap() || (cm.isObject() && 
info(value).isChildOf(Map.class))) {
+                       if (cm.isMap() || (cm.isObject() && 
info(value).isAssignableTo(Map.class))) {
                                if (((Map<?,?>)value).isEmpty())
                                        return true;
                        }
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 ea535af188..b26226693d 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
@@ -155,7 +155,7 @@ public class AutoNumberSwap<T> extends ObjectSwap<T,Number> 
{
                        mi.isNotDeprecated()
                        && mi.isNotStatic()
                        && mi.isVisible(bc.getBeanMethodVisibility())
-                       && (rt.isChildOf(Number.class) || (rt.isPrimitive() && 
rt.isAny(int.class, short.class, long.class, float.class, double.class, 
byte.class)))
+                       && (rt.isAssignableTo(Number.class) || 
(rt.isPrimitive() && rt.isAny(int.class, short.class, long.class, float.class, 
double.class, byte.class)))
                        && mi.hasAnyName(SWAP_METHOD_NAMES)
                        && mi.hasParameterTypesLenient(BeanSession.class)
                        && ! mi.getMatchingMethods().stream().anyMatch(m2 -> 
bc.getAnnotationProvider().has(BeanIgnore.class, m2));
@@ -190,7 +190,7 @@ public class AutoNumberSwap<T> extends ObjectSwap<T,Number> 
{
                return
                        ci.isNonStaticMemberClass()
                        || ci.isPrimitive()
-                       || ci.isChildOf(Number.class)
+                       || ci.isAssignableTo(Number.class)
                        || bc.getAnnotationProvider().has(BeanIgnore.class, ci);
                // @formatter:on
        }
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 807c0ce4c4..0faeabd6d8 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
@@ -111,7 +111,7 @@ public class BuilderSwap<T,B> {
                        var cc = pci.getPublicConstructor(
                                x -> x.isVisible(cVis)
                                && x.hasNumParameters(1)
-                               && 
x.getParameter(0).getParameterType().isChildOf(Builder.class)
+                               && 
x.getParameter(0).getParameterType().isAssignableTo(Builder.class)
                        ).orElse(null);
                        // @formatter:on
                        if (nn(cc)) {
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/ObjectSwap.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/ObjectSwap.java
index 67f560c3b9..db526e81ab 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/ObjectSwap.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/ObjectSwap.java
@@ -226,7 +226,7 @@ public abstract class ObjectSwap<T,S> {
        public boolean isNormalObject(Object o) {
                if (o == null)
                        return false;
-               return normalClassInfo.isParentOf(o.getClass());
+               return normalClassInfo.isAssignableFrom(o.getClass());
        }
 
        /**
@@ -240,7 +240,7 @@ public abstract class ObjectSwap<T,S> {
        public boolean isSwappedObject(Object o) {
                if (o == null)
                        return false;
-               return swapClassInfo.isParentOf(o.getClass());
+               return swapClassInfo.isAssignableFrom(o.getClass());
        }
 
        /**
diff --git 
a/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/JettyMicroservice.java
 
b/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/JettyMicroservice.java
index c450e62b19..40063f6991 100644
--- 
a/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/JettyMicroservice.java
+++ 
b/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/JettyMicroservice.java
@@ -573,7 +573,7 @@ public class JettyMicroservice extends Microservice {
                for (var s : 
cf.get("Jetty/servlets").asStringArray().orElse(new String[0])) {
                        try {
                                var c = info(Class.forName(s));
-                               if (c.isChildOf(RestServlet.class)) {
+                               if (c.isAssignableTo(RestServlet.class)) {
                                        var rs = (RestServlet)c.newInstance();
                                        addServlet(rs, rs.getPath());
                                } else {
@@ -587,7 +587,7 @@ public class JettyMicroservice extends Microservice {
                
cf.get("Jetty/servletMap").asMap().orElse(EMPTY_MAP).forEach((k, v) -> {
                        try {
                                var c = info(Class.forName(v.toString()));
-                               if (c.isChildOf(Servlet.class)) {
+                               if (c.isAssignableTo(Servlet.class)) {
                                        var rs = (Servlet)c.newInstance();
                                        addServlet(rs, k);
                                } else {
diff --git 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
index adcaa74397..a90016beae 100644
--- 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
+++ 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
@@ -2941,7 +2941,7 @@ public class RestClient extends BeanContextable 
implements HttpClient, Closeable
                                        continue;
                                var ci = ClassInfo.of(c);
                                if (nn(ci)) {
-                                       if 
(ci.isChildOfAny(RestCallInterceptor.class, HttpRequestInterceptor.class, 
HttpResponseInterceptor.class))
+                                       if 
(ci.isAssignableToAny(RestCallInterceptor.class, HttpRequestInterceptor.class, 
HttpResponseInterceptor.class))
                                                interceptors(ci.newInstance());
                                        else
                                                throw new 
ConfigException("Invalid class of type ''{0}'' passed to interceptors().", 
ci.getName());
@@ -3007,7 +3007,7 @@ public class RestClient extends BeanContextable 
implements HttpClient, Closeable
                                        continue;
                                ClassInfo ci = ClassInfo.of(o);
                                if (nn(ci)) {
-                                       if (! 
ci.isChildOfAny(HttpRequestInterceptor.class, HttpResponseInterceptor.class, 
RestCallInterceptor.class))
+                                       if (! 
ci.isAssignableToAny(HttpRequestInterceptor.class, 
HttpResponseInterceptor.class, RestCallInterceptor.class))
                                                throw new 
ConfigException("Invalid object of type ''{0}'' passed to interceptors().", 
ci.getName());
                                        if (o instanceof HttpRequestInterceptor 
o2)
                                                addInterceptorLast(o2);
diff --git 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/HttpHeaders.java
 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/HttpHeaders.java
index 8a8adfd75b..d54d4d8a87 100644
--- 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/HttpHeaders.java
+++ 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/HttpHeaders.java
@@ -505,7 +505,7 @@ public class HttpHeaders {
                if (o == null)
                        return false;
                var ci = ClassInfo.of(o);
-               return nn(ci) && ci.isChildOfAny(Header.class, 
Headerable.class, NameValuePair.class, NameValuePairable.class, 
Map.Entry.class);
+               return nn(ci) && ci.isAssignableToAny(Header.class, 
Headerable.class, NameValuePair.class, NameValuePairable.class, 
Map.Entry.class);
        }
 
        /**
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 9658d146e5..962d3a9c9a 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
@@ -157,7 +157,7 @@ public class HttpParts {
                if (o == null)
                        return false;
                var ci = ClassInfo.of(o);
-               return nn(ci) && ci.isChildOfAny(Headerable.class, 
NameValuePair.class, NameValuePairable.class, Map.Entry.class);
+               return nn(ci) && ci.isAssignableToAny(Headerable.class, 
NameValuePair.class, NameValuePairable.class, Map.Entry.class);
        }
 
        /**
@@ -360,8 +360,8 @@ public class HttpParts {
         */
        public static boolean isHttpPart(HttpPartType partType, ClassMeta<?> 
type) {
                return switch (partType) {
-                       case PATH, QUERY, FORMDATA -> 
type.getProperty("HttpPart.isNameValuePair", x -> 
x.isChildOf(NameValuePair.class)).orElse(false);
-                       case HEADER -> type.getProperty("HttpPart.isHeader", x 
-> x.isChildOf(org.apache.http.Header.class)).orElse(false);
+                       case PATH, QUERY, FORMDATA -> 
type.getProperty("HttpPart.isNameValuePair", x -> 
x.isAssignableTo(NameValuePair.class)).orElse(false);
+                       case HEADER -> type.getProperty("HttpPart.isHeader", x 
-> x.isAssignableTo(org.apache.http.Header.class)).orElse(false);
                        default -> false;
                };
        }
diff --git 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/part/BasicPart.java
 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/part/BasicPart.java
index 9940f3057a..615251e621 100644
--- 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/part/BasicPart.java
+++ 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/part/BasicPart.java
@@ -60,7 +60,7 @@ public class BasicPart implements NameValuePair, Headerable {
                if (o == null)
                        return false;
                var ci = ClassInfo.of(o);
-               return nn(ci) && ci.isChildOfAny(Headerable.class, 
NameValuePair.class, NameValuePairable.class, Map.Entry.class);
+               return nn(ci) && ci.isAssignableToAny(Headerable.class, 
NameValuePair.class, NameValuePairable.class, Map.Entry.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 e3dc57f604..f8d2f3193e 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
@@ -5922,7 +5922,7 @@ public class RestContext extends Context {
                if (ci.hasAnnotation(Response.class))
                        return t;
 
-               if (ci.isChildOf(ParseException.class) || 
ci.is(InvalidDataConversionException.class))
+               if (ci.isAssignableTo(ParseException.class) || 
ci.is(InvalidDataConversionException.class))
                        return new BadRequest(t);
 
                String n = cn(t);
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/commons/reflect/ClassInfo_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/commons/reflect/ClassInfo_Test.java
index c88d407abe..3629843542 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/commons/reflect/ClassInfo_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/commons/reflect/ClassInfo_Test.java
@@ -2621,34 +2621,76 @@ public class ClassInfo_Test extends TestBase {
        
//====================================================================================================
        @Test
        void a077_isChildOf() {
-               assertTrue(ka.isChildOf(KA.class));
-               assertFalse(ka.isChildOf(KB.class));
-               assertFalse(ka.isChildOf(KC.class));
-               assertTrue(kb.isChildOf(KA.class));
-               assertTrue(kb.isChildOf(KB.class));
-               assertFalse(kb.isChildOf(KC.class));
-               assertTrue(kc.isChildOf(KA.class));
-               assertTrue(kc.isChildOf(KB.class));
-               assertTrue(kc.isChildOf(KC.class));
+               assertTrue(ka.isAssignableTo(KA.class));
+               assertFalse(ka.isAssignableTo(KB.class));
+               assertFalse(ka.isAssignableTo(KC.class));
+               assertTrue(kb.isAssignableTo(KA.class));
+               assertTrue(kb.isAssignableTo(KB.class));
+               assertFalse(kb.isAssignableTo(KC.class));
+               assertTrue(kc.isAssignableTo(KA.class));
+               assertTrue(kc.isAssignableTo(KB.class));
+               assertTrue(kc.isAssignableTo(KC.class));
+               // Test with null
+               assertFalse(ka.isAssignableTo((Class<?>)null));
+               // Test on types
+               assertFalse(ka.isAssignableTo(aType));
+               assertFalse(ka.isAssignableTo(pType));
+               assertFalse(ka.isAssignableTo(pTypeDimensional));
+               assertFalse(ka.isAssignableTo(pTypeGeneric));
+               assertFalse(ka.isAssignableTo(pTypeGenericArg));
+               assertFalse(aTypeInfo.isAssignableTo(KA.class));
+               assertFalse(pTypeInfo.isAssignableTo(KA.class));
+               assertFalse(pTypeDimensionalInfo.isAssignableTo(KA.class));
+               assertFalse(pTypeGenericInfo.isAssignableTo(KA.class));
+               assertFalse(pTypeGenericArgInfo.isAssignableTo(KA.class));
+
+               // Test isChildOf(ClassInfo)
+               assertTrue(kb.isAssignableTo(ka));
+               assertTrue(kc.isAssignableTo(ka));
+               assertTrue(kc.isAssignableTo(kb));
+               assertFalse(ka.isAssignableTo(kb));
+       }
+
+       
//====================================================================================================
+       // isChildOf(Class<?>) - strict version
+       
//====================================================================================================
+       @Test
+       void a077a_isChildOf_strict() {
+               // Strict version excludes same class
+               assertFalse(ka.isChildOf(KA.class));  // Same class, should be 
false
+               assertTrue(kb.isChildOf(KA.class));   // KB extends KA, should 
be true
+               assertTrue(kc.isChildOf(KA.class));   // KC extends KB extends 
KA, should be true
+               assertFalse(kb.isChildOf(KB.class));   // Same class, should be 
false
+               assertTrue(kc.isChildOf(KB.class));   // KC extends KB, should 
be true
+               assertFalse(kc.isChildOf(KC.class));  // Same class, should be 
false
+               assertFalse(ka.isChildOf(KB.class));  // KA is not a child of 
KB, should be false
+               assertFalse(ka.isChildOf(KC.class));  // KA is not a child of 
KC, should be false
                // Test with null
                assertFalse(ka.isChildOf((Class<?>)null));
                // Test on types
                assertFalse(ka.isChildOf(aType));
-               assertFalse(ka.isChildOf(pType));
-               assertFalse(ka.isChildOf(pTypeDimensional));
-               assertFalse(ka.isChildOf(pTypeGeneric));
-               assertFalse(ka.isChildOf(pTypeGenericArg));
                assertFalse(aTypeInfo.isChildOf(KA.class));
-               assertFalse(pTypeInfo.isChildOf(KA.class));
-               assertFalse(pTypeDimensionalInfo.isChildOf(KA.class));
-               assertFalse(pTypeGenericInfo.isChildOf(KA.class));
-               assertFalse(pTypeGenericArgInfo.isChildOf(KA.class));
+       }
 
-               // Test isChildOf(ClassInfo)
-               assertTrue(kb.isChildOf(ka));
-               assertTrue(kc.isChildOf(ka));
-               assertTrue(kc.isChildOf(kb));
-               assertFalse(ka.isChildOf(kb));
+       
//====================================================================================================
+       // isParentOf(Class<?>) - strict version
+       
//====================================================================================================
+       @Test
+       void a077b_isParentOf_strict() {
+               // Strict version excludes same class
+               assertFalse(ka.isParentOf(KA.class));  // Same class, should be 
false
+               assertTrue(ka.isParentOf(KB.class));   // KA is parent of KB, 
should be true
+               assertTrue(ka.isParentOf(KC.class));   // KA is parent of KC, 
should be true
+               assertFalse(kb.isParentOf(KB.class));  // Same class, should be 
false
+               assertTrue(kb.isParentOf(KC.class));   // KB is parent of KC, 
should be true
+               assertFalse(kc.isParentOf(KC.class)); // Same class, should be 
false
+               assertFalse(kb.isParentOf(KA.class));  // KB is not a parent of 
KA, should be false
+               assertFalse(kc.isParentOf(KA.class));  // KC is not a parent of 
KA, should be false
+               // Test with null
+               assertFalse(ka.isParentOf((Class<?>)null));
+               // Test on types
+               assertFalse(ka.isParentOf(aType));
+               assertFalse(aTypeInfo.isParentOf(KA.class));
        }
 
        
//====================================================================================================
@@ -2656,21 +2698,21 @@ public class ClassInfo_Test extends TestBase {
        
//====================================================================================================
        @Test
        void a078_isChildOfAny() {
-               assertTrue(ka.isChildOfAny(KA.class));
-               assertFalse(ka.isChildOfAny(KB.class));
-               assertFalse(ka.isChildOfAny(KC.class));
-               assertTrue(kb.isChildOfAny(KA.class));
-               assertTrue(kb.isChildOfAny(KB.class));
-               assertFalse(kb.isChildOfAny(KC.class));
-               assertTrue(kc.isChildOfAny(KA.class));
-               assertTrue(kc.isChildOfAny(KB.class));
-               assertTrue(kc.isChildOfAny(KC.class));
+               assertTrue(ka.isAssignableToAny(KA.class));
+               assertFalse(ka.isAssignableToAny(KB.class));
+               assertFalse(ka.isAssignableToAny(KC.class));
+               assertTrue(kb.isAssignableToAny(KA.class));
+               assertTrue(kb.isAssignableToAny(KB.class));
+               assertFalse(kb.isAssignableToAny(KC.class));
+               assertTrue(kc.isAssignableToAny(KA.class));
+               assertTrue(kc.isAssignableToAny(KB.class));
+               assertTrue(kc.isAssignableToAny(KC.class));
                // Test on types
-               assertFalse(aTypeInfo.isChildOfAny(KA.class));
-               assertFalse(pTypeInfo.isChildOfAny(KA.class));
-               assertFalse(pTypeDimensionalInfo.isChildOfAny(KA.class));
-               assertFalse(pTypeGenericInfo.isChildOfAny(KA.class));
-               assertFalse(pTypeGenericArgInfo.isChildOfAny(KA.class));
+               assertFalse(aTypeInfo.isAssignableToAny(KA.class));
+               assertFalse(pTypeInfo.isAssignableToAny(KA.class));
+               assertFalse(pTypeDimensionalInfo.isAssignableToAny(KA.class));
+               assertFalse(pTypeGenericInfo.isAssignableToAny(KA.class));
+               assertFalse(pTypeGenericArgInfo.isAssignableToAny(KA.class));
        }
 
        
//====================================================================================================
@@ -2947,28 +2989,28 @@ public class ClassInfo_Test extends TestBase {
        
//====================================================================================================
        @Test
        void a093_isParentOf() {
-               assertTrue(ka.isParentOf(KA.class));
-               assertTrue(ka.isParentOf(KB.class));
-               assertTrue(ka.isParentOf(KC.class));
-               assertFalse(kb.isParentOf(KA.class));
-               assertTrue(kb.isParentOf(KB.class));
-               assertTrue(kb.isParentOf(KC.class));
-               assertFalse(kc.isParentOf(KA.class));
-               assertFalse(kc.isParentOf(KB.class));
-               assertTrue(kc.isParentOf(KC.class));
+               assertTrue(ka.isAssignableFrom(KA.class));
+               assertTrue(ka.isAssignableFrom(KB.class));
+               assertTrue(ka.isAssignableFrom(KC.class));
+               assertFalse(kb.isAssignableFrom(KA.class));
+               assertTrue(kb.isAssignableFrom(KB.class));
+               assertTrue(kb.isAssignableFrom(KC.class));
+               assertFalse(kc.isAssignableFrom(KA.class));
+               assertFalse(kc.isAssignableFrom(KB.class));
+               assertTrue(kc.isAssignableFrom(KC.class));
                // Test with null
-               assertFalse(ka.isParentOf((Class<?>)null));
+               assertFalse(ka.isAssignableFrom((Class<?>)null));
                // Test on types
-               assertFalse(ka.isParentOf(aType));
-               assertFalse(ka.isParentOf(pType));
-               assertFalse(ka.isParentOf(pTypeDimensional));
-               assertFalse(ka.isParentOf(pTypeGeneric));
-               assertFalse(ka.isParentOf(pTypeGenericArg));
-               assertFalse(aTypeInfo.isParentOf(KA.class));
-               assertFalse(pTypeInfo.isParentOf(KA.class));
-               assertFalse(pTypeDimensionalInfo.isParentOf(KA.class));
-               assertFalse(pTypeGenericInfo.isParentOf(KA.class));
-               assertFalse(pTypeGenericArgInfo.isParentOf(KA.class));
+               assertFalse(ka.isAssignableFrom(aType));
+               assertFalse(ka.isAssignableFrom(pType));
+               assertFalse(ka.isAssignableFrom(pTypeDimensional));
+               assertFalse(ka.isAssignableFrom(pTypeGeneric));
+               assertFalse(ka.isAssignableFrom(pTypeGenericArg));
+               assertFalse(aTypeInfo.isAssignableFrom(KA.class));
+               assertFalse(pTypeInfo.isAssignableFrom(KA.class));
+               assertFalse(pTypeDimensionalInfo.isAssignableFrom(KA.class));
+               assertFalse(pTypeGenericInfo.isAssignableFrom(KA.class));
+               assertFalse(pTypeGenericArgInfo.isAssignableFrom(KA.class));
        }
 
        
//====================================================================================================
@@ -2977,23 +3019,23 @@ public class ClassInfo_Test extends TestBase {
        @Test
        void a093b_isParentOf_ClassInfo() {
                // Test isParentOf(ClassInfo) with valid classes
-               assertTrue(ka.isParentOf(ka));
-               assertTrue(ka.isParentOf(kb));
-               assertTrue(ka.isParentOf(kc));
-               assertFalse(kb.isParentOf(ka));
-               assertTrue(kb.isParentOf(kb));
-               assertTrue(kb.isParentOf(kc));
-               assertFalse(kc.isParentOf(ka));
-               assertFalse(kc.isParentOf(kb));
-               assertTrue(kc.isParentOf(kc));
+               assertTrue(ka.isAssignableFrom(ka));
+               assertTrue(ka.isAssignableFrom(kb));
+               assertTrue(ka.isAssignableFrom(kc));
+               assertFalse(kb.isAssignableFrom(ka));
+               assertTrue(kb.isAssignableFrom(kb));
+               assertTrue(kb.isAssignableFrom(kc));
+               assertFalse(kc.isAssignableFrom(ka));
+               assertFalse(kc.isAssignableFrom(kb));
+               assertTrue(kc.isAssignableFrom(kc));
 
                // Test with null child (line 2029)
-               assertFalse(ka.isParentOf((ClassInfo)null));
+               assertFalse(ka.isAssignableFrom((ClassInfo)null));
 
                // Test with null inner
                var nullInnerCi = ClassInfo.of((Class<?>)null, pType);
-               assertFalse(nullInnerCi.isParentOf(ka));
-               assertFalse(nullInnerCi.isParentOf((ClassInfo)null));
+               assertFalse(nullInnerCi.isAssignableFrom(ka));
+               assertFalse(nullInnerCi.isAssignableFrom((ClassInfo)null));
        }
 
        
//====================================================================================================
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_Config_RestClient_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_Config_RestClient_Test.java
index 9bb1304e0a..417b66b853 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_Config_RestClient_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_Config_RestClient_Test.java
@@ -427,7 +427,7 @@ class RestClient_Config_RestClient_Test extends TestBase {
 
                private static Object in(HttpPartType type, HttpPartSchema 
schema, String in, ClassMeta<?> c) {
                        try {
-                               if (c.isParentOf(ABean.class))
+                               if (c.isAssignableFrom(ABean.class))
                                        return 
Json5.DEFAULT.read(in.substring(1),c);
                                return 
SimplePartParser.DEFAULT.parse(type,schema,in,c);
                        } catch (Exception e) {

Reply via email to