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 7ea7117c4a Marshall module improvements
7ea7117c4a is described below

commit 7ea7117c4ae7e4d484fc47db31521e83ef8b3917
Author: James Bognar <[email protected]>
AuthorDate: Fri Dec 5 19:21:00 2025 -0500

    Marshall module improvements
---
 .../juneau/commons/reflect/ClassInfoTyped.java     |   5 +
 .../java/org/apache/juneau/config/Section.java     |   4 +-
 .../org/apache/juneau/jena/RdfParserSession.java   |  10 +-
 .../apache/juneau/jena/RdfSerializerSession.java   |   4 +-
 .../main/java/org/apache/juneau/BeanContext.java   |   6 +-
 .../src/main/java/org/apache/juneau/BeanMap.java   |   2 +-
 .../src/main/java/org/apache/juneau/BeanMeta.java  |  14 +-
 .../java/org/apache/juneau/BeanPropertyMeta.java   |  14 +-
 .../java/org/apache/juneau/BeanPropertyValue.java  |   2 +-
 .../main/java/org/apache/juneau/BeanRegistry.java  |   6 +-
 .../main/java/org/apache/juneau/BeanSession.java   |  14 +-
 .../org/apache/juneau/BeanTraverseSession.java     |   2 +-
 .../src/main/java/org/apache/juneau/ClassMeta.java | 310 ++++-----------------
 .../java/org/apache/juneau/ExtendedClassMeta.java  |   2 +-
 .../org/apache/juneau/collections/JsonMap.java     |  12 +-
 .../org/apache/juneau/html/HtmlParserSession.java  |  12 +-
 .../apache/juneau/html/HtmlSerializerSession.java  |   2 +-
 .../org/apache/juneau/httppart/HttpPartSchema.java |   2 +-
 .../juneau/httppart/SimplePartParserSession.java   |   2 +-
 .../apache/juneau/internal/DelegateBeanMap.java    |   2 +-
 .../org/apache/juneau/json/JsonParserSession.java  |   8 +-
 .../apache/juneau/json/JsonSerializerSession.java  |   2 +-
 .../juneau/jsonschema/BasicBeanDefMapper.java      |   2 +-
 .../juneau/jsonschema/JsonSchemaGenerator.java     |   2 +-
 .../jsonschema/JsonSchemaGeneratorSession.java     |   4 +-
 .../juneau/msgpack/MsgPackParserSession.java       |   6 +-
 .../juneau/msgpack/MsgPackSerializerSession.java   |   2 +-
 .../apache/juneau/oapi/OpenApiParserSession.java   |   4 +-
 .../org/apache/juneau/parser/ParserSession.java    |   6 +-
 .../java/org/apache/juneau/parser/ParserSet.java   |   2 +-
 .../apache/juneau/serializer/SerializerSet.java    |   2 +-
 .../org/apache/juneau/swaps/InputStreamSwap.java   |   2 +-
 .../java/org/apache/juneau/swaps/TemporalSwap.java |   2 +-
 .../org/apache/juneau/uon/UonParserSession.java    |  10 +-
 .../apache/juneau/uon/UonSerializerSession.java    |   2 +-
 .../urlencoding/UrlEncodingParserSession.java      |   6 +-
 .../java/org/apache/juneau/xml/XmlBeanMeta.java    |   4 +-
 .../org/apache/juneau/xml/XmlBeanPropertyMeta.java |   4 +-
 .../org/apache/juneau/xml/XmlParserSession.java    |  10 +-
 .../apache/juneau/xml/XmlSerializerSession.java    |   2 +-
 .../apache/juneau/rest/client/RestResponse.java    |   2 +-
 .../java/org/apache/juneau/rest/RestRequest.java   |   2 +-
 .../org/apache/juneau/rest/arg/FormDataArg.java    |   2 +-
 .../java/org/apache/juneau/rest/arg/HeaderArg.java |   2 +-
 .../java/org/apache/juneau/rest/arg/QueryArg.java  |   2 +-
 .../apache/juneau/rest/rrpc/RrpcRestOpContext.java |   2 +-
 .../test/java/org/apache/juneau/BeanMap_Test.java  |  54 ++--
 .../java/org/apache/juneau/ClassMeta_Test.java     |  80 +++---
 .../apache/juneau/objecttools/ObjectRest_Test.java |   4 +-
 49 files changed, 225 insertions(+), 434 deletions(-)

diff --git 
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/reflect/ClassInfoTyped.java
 
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/reflect/ClassInfoTyped.java
index 49248b3298..72886cd5c8 100644
--- 
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/reflect/ClassInfoTyped.java
+++ 
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/reflect/ClassInfoTyped.java
@@ -44,6 +44,11 @@ public class ClassInfoTyped<T> extends ClassInfo {
                super(inner, innerType);
        }
 
+       @Override
+       public Class<T> inner() {
+               return (Class<T>)super.inner();
+       }
+
        @Override
        public T getPrimitiveDefault() { return (T)super.getPrimitiveDefault(); 
}
 }
diff --git 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/Section.java 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/Section.java
index 23bfa248fc..752edc2058 100644
--- 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/Section.java
+++ 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/Section.java
@@ -117,7 +117,7 @@ public class Section {
                                if (! ignoreUnknownProperties)
                                        throw new ParseException("Unknown 
property ''{0}'' encountered in configuration section ''{1}''.", k, name);
                        } else {
-                               bm.put(k, config.get(name + '/' + 
k).as(bpm.getClassMeta().getInnerClass()).orElse(null));
+                               bm.put(k, config.get(name + '/' + 
k).as(bpm.getClassMeta().inner()).orElse(null));
                        }
                }
 
@@ -254,7 +254,7 @@ public class Section {
                                if (! ignoreUnknownProperties)
                                        throw new ParseException("Unknown 
property ''{0}'' encountered in configuration section ''{1}''.", k, name);
                        } else {
-                               bm.put(k, config.get(name + '/' + 
k).as(bpm.getClassMeta().getInnerClass()).orElse(null));
+                               bm.put(k, config.get(name + '/' + 
k).as(bpm.getClassMeta().inner()).orElse(null));
                        }
                }
 
diff --git 
a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParserSession.java
 
b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParserSession.java
index 8540508ca6..f46e534506 100644
--- 
a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParserSession.java
+++ 
b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParserSession.java
@@ -392,7 +392,7 @@ public class RdfParserSession extends ReaderParserSession {
                } else if (sType.isChar()) {
                        o = parseCharacter(decodeString(getValue(n, outer)));
                } else if (sType.isNumber()) {
-                       o = parseNumber(getValue(n, outer).toString(), (Class<? 
extends Number>)sType.getInnerClass());
+                       o = parseNumber(getValue(n, outer).toString(), (Class<? 
extends Number>)sType.inner());
                } else if (sType.isMap()) {
                        var r = n.asResource();
                        if (! urisVisited.add(r))
@@ -428,7 +428,7 @@ public class RdfParserSession extends ReaderParserSession {
                        var r = n.asResource();
                        if (! urisVisited.add(r))
                                return null;
-                       var bm = newBeanMap(outer, sType.getInnerClass());
+                       var bm = newBeanMap(outer, sType.inner());
                        o = parseIntoBeanMap(r, bm).getBean();
                } else if (sType.isUri() && n.isResource()) {
                        o = sType.newInstanceFromString(outer, 
decodeString(n.asResource().getURI()));
@@ -441,11 +441,11 @@ public class RdfParserSession extends ReaderParserSession 
{
                        if (m.containsKey(getBeanTypePropertyName(eType)))
                                o = cast((JsonMap)m, pMeta, eType);
                        else if (nn(sType.getProxyInvocationHandler()))
-                               o = newBeanMap(outer, 
sType.getInnerClass()).load(m).getBean();
+                               o = newBeanMap(outer, 
sType.inner()).load(m).getBean();
                        else
-                               throw new ParseException(this, "Class ''{0}'' 
could not be instantiated.  Reason: ''{1}''", sType.getInnerClass().getName(), 
sType.getNotABeanReason());
+                               throw new ParseException(this, "Class ''{0}'' 
could not be instantiated.  Reason: ''{1}''", sType.inner().getName(), 
sType.getNotABeanReason());
                } else {
-                       throw new ParseException(this, "Class ''{0}'' could not 
be instantiated.  Reason: ''{1}''", sType.getInnerClass().getName(), 
sType.getNotABeanReason());
+                       throw new ParseException(this, "Class ''{0}'' could not 
be instantiated.  Reason: ''{1}''", sType.inner().getName(), 
sType.getNotABeanReason());
                }
 
                if (nn(swap) && nn(o))
diff --git 
a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
 
b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
index da53123835..9237e83d3e 100644
--- 
a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
+++ 
b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
@@ -403,7 +403,7 @@ public class RdfSerializerSession extends 
WriterSerializerSession {
 
                } else if (sType.isCollectionOrArray() || (nn(wType) && 
wType.isCollection())) {
 
-                       var c = sort(sType.isCollection() ? (Collection)o : 
toList(sType.getInnerClass(), o));
+                       var c = sort(sType.isCollection() ? (Collection)o : 
toList(sType.inner(), o));
                        var f = getCollectionFormat();
                        var cRdf = getRdfClassMeta(sType);
                        var bpRdf = getRdfBeanPropertyMeta(bpm);
@@ -545,7 +545,7 @@ public class RdfSerializerSession extends 
WriterSerializerSession {
 
                var cm = getClassMetaForObject(o);
                if (isLooseCollections() && nn(cm) && cm.isCollectionOrArray()) 
{
-                       Collection c = cm.isCollection() ? (Collection)o : 
toList(cm.getInnerClass(), o);
+                       Collection c = cm.isCollection() ? (Collection)o : 
toList(cm.inner(), o);
                        forEachEntry(c, x -> serializeAnything(x, false, 
object(), "root", null, null));
                } else {
                        RDFNode n = serializeAnything(o, false, 
getExpectedRootType(o), "root", null, null);
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 2883a6080f..a871e305f1 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
@@ -4441,10 +4441,10 @@ public class BeanContext extends Context {
                        if (cm.getBeanContext() == this)
                                return cm;
                        if (cm.isMap())
-                               return getClassMeta(cm.innerClass, 
cm.getKeyType(), cm.getValueType());
+                               return getClassMeta(cm.inner(), 
cm.getKeyType(), cm.getValueType());
                        if (cm.isCollection() || cm.isOptional())
-                               return getClassMeta(cm.innerClass, 
cm.getElementType());
-                       return getClassMeta(cm.innerClass);
+                               return getClassMeta(cm.inner(), 
cm.getElementType());
+                       return getClassMeta(cm.inner());
                }
 
                Class c = resolve(o, typeVarImpls);
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMap.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMap.java
index b85e10d557..e440ed6f64 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMap.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMap.java
@@ -431,7 +431,7 @@ public class BeanMap<T> extends AbstractMap<String,Object> 
implements Delegate<T
                                propertyCache.forEach((k, v) -> put(k, v));
                                propertyCache = null;
                        } catch (IllegalArgumentException e) {
-                               throw bex(e, meta.classMeta.innerClass, 
"IllegalArgumentException occurred on call to class constructor ''{0}'' with 
argument types ''{1}''", c.getSimpleName(),
+                               throw bex(e, meta.classMeta.inner(), 
"IllegalArgumentException occurred on call to class constructor ''{0}'' with 
argument types ''{1}''", c.getSimpleName(),
                                        
Json5Serializer.DEFAULT.toString(getClasses(args)));
                        } catch (Exception e) {
                                throw bex(e);
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 8746f0b110..2b435ee78a 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
@@ -163,13 +163,13 @@ public class BeanMeta<T> {
                                if (nn(s))
                                        return s;
                        }
-                       var pcm = cm.innerClass.getSuperclass();
+                       var pcm = cm.inner().getSuperclass();
                        if (nn(pcm)) {
                                var s = 
findDictionaryName(ctx.getClassMeta(pcm));
                                if (nn(s))
                                        return s;
                        }
-                       for (var icm : cm.innerClass.getInterfaces()) {
+                       for (var icm : cm.inner().getInterfaces()) {
                                var s = 
findDictionaryName(ctx.getClassMeta(icm));
                                if (nn(s))
                                        return s;
@@ -193,7 +193,7 @@ public class BeanMeta<T> {
                }
 
                String init(BeanMeta<T> beanMeta) {
-                       var c = classMeta.getInnerClass();
+                       var c = classMeta.inner();
                        var ci = classMeta;
                        var ap = ctx.getAnnotationProvider();
 
@@ -210,7 +210,7 @@ public class BeanMeta<T> {
                                var typeName = Value.<String>empty();
                                classMeta.forEachAnnotation(Bean.class, x -> 
isNotEmpty(x.typeName()), x -> typeName.set(x.typeName()));
                                if (typeName.isPresent())
-                                       bdClasses.add(classMeta.innerClass);
+                                       bdClasses.add(classMeta.inner());
                                this.beanRegistry = new BeanRegistry(ctx, null, 
bdClasses.toArray(new Class<?>[bdClasses.size()]));
 
                                var typePropertyName = Value.<String>empty();
@@ -889,7 +889,7 @@ public class BeanMeta<T> {
        protected BeanMeta(ClassMeta<T> classMeta, BeanContext ctx, BeanFilter 
beanFilter, String[] pNames, ConstructorInfo implClassConstructor) {
                this.classMeta = classMeta;
                this.ctx = ctx;
-               this.c = classMeta.getInnerClass();
+               this.c = classMeta.inner();
 
                Builder<T> b = new Builder<>(classMeta, ctx, beanFilter, 
pNames, implClassConstructor);
                notABeanReason = b.init(this);
@@ -1053,8 +1053,8 @@ public class BeanMeta<T> {
                                return constructor.<T>newInstance();
                        InvocationHandler h = 
classMeta.getProxyInvocationHandler();
                        if (nn(h)) {
-                               ClassLoader cl = 
classMeta.innerClass.getClassLoader();
-                               return (T)Proxy.newProxyInstance(cl, 
a(classMeta.innerClass, java.io.Serializable.class), h);
+                               ClassLoader cl = 
classMeta.inner().getClassLoader();
+                               return (T)Proxy.newProxyInstance(cl, 
a(classMeta.inner(), java.io.Serializable.class), h);
                        }
                }
                return null;
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 10674c9f2c..5cd1381b43 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
@@ -922,7 +922,7 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
 
        @Override /* Overridden from Object */
        public String toString() {
-               return name + ": " + this.rawTypeMeta.getInnerClass().getName() 
+ ", field=[" + field + "], getter=[" + getter + "], setter=[" + setter + "]";
+               return name + ": " + this.rawTypeMeta.inner().getName() + ", 
field=[" + field + "], getter=[" + getter + "], setter=[" + setter + "]";
        }
 
        private Object applyChildPropertiesFilter(BeanSession session, 
ClassMeta cm, Object o) {
@@ -1047,7 +1047,7 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                                m = (Map<String,Object>)getter.invoke(bean);
                        else
                                throw bex(beanMeta.c, "Cannot set property 
''{0}'' of type ''{1}'' to object of type ''{2}'' because no setter is defined 
on this property, and the existing property value is null",
-                                       name, 
this.getClassMeta().getInnerClass().getName(), findClassName(val));
+                                       name, 
this.getClassMeta().inner().getName(), findClassName(val));
                        return (m == null ? null : m.put(pName, val));
                }
                if (nn(setter))
@@ -1057,7 +1057,7 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                        return null;
                }
                throw bex(beanMeta.c, "Cannot set property ''{0}'' of type 
''{1}'' to object of type ''{2}'' because no setter is defined on this 
property, and the existing property value is null", name,
-                       this.getClassMeta().getInnerClass().getName(), 
findClassName(val));
+                       this.getClassMeta().inner().getName(), 
findClassName(val));
        }
 
        @SuppressWarnings("null")
@@ -1095,7 +1095,7 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                        try {
 
                                var r = (bc.isBeanMapPutReturnsOldValue() || 
isMap || isCollection) && (nn(getter) || nn(field)) ? get(m, pName) : null;
-                               var propertyClass = rawTypeMeta.getInnerClass();
+                               var propertyClass = rawTypeMeta.inner();
                                var pcInfo = rawTypeMeta;
 
                                if (value == null && (isMap || isCollection)) {
@@ -1131,7 +1131,7 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                                                                if (! 
valueType.isObject()) {
                                                                        var 
needsConversion = Flag.create();
                                                                        
valueMap.forEach((k, v) -> {
-                                                                               
if (nn(v) && ! valueType.getInnerClass().isInstance(v)) {
+                                                                               
if (nn(v) && ! valueType.inner().isInstance(v)) {
                                                                                
        needsConversion.set();
                                                                                
}
                                                                        });
@@ -1190,7 +1190,7 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                                                                        List l 
= new JsonList(valueList);
                                                                        for 
(ListIterator<Object> i = l.listIterator(); i.hasNext();) {
                                                                                
Object v = i.next();
-                                                                               
if (nn(v) && (! elementType.getInnerClass().isInstance(v))) {
+                                                                               
if (nn(v) && (! elementType.inner().isInstance(v))) {
                                                                                
        i.set(session.convertToType(v, elementType));
                                                                                
}
                                                                        }
@@ -1310,7 +1310,7 @@ public class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
         * @throws InvocationTargetException Thrown by method invocation.
         */
        protected void setArray(Object bean, List l) throws 
IllegalArgumentException, IllegalAccessException, InvocationTargetException {
-               Object array = toArray(l, 
this.rawTypeMeta.getElementType().getInnerClass());
+               Object array = toArray(l, 
this.rawTypeMeta.getElementType().inner());
                invokeSetter(bean, name, array);
        }
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyValue.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyValue.java
index 7d0a9515b4..d9e8e1b1cc 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyValue.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyValue.java
@@ -91,7 +91,7 @@ public class BeanPropertyValue implements 
Comparable<BeanPropertyValue> {
                        .create()
                        .append("name", name)
                        .append("value", value)
-                       .append("type", 
pMeta.getClassMeta().getInnerClass().getSimpleName())
+                       .append("type", 
pMeta.getClassMeta().inner().getSimpleName())
                        .toString();
                // @formatter:on
        }
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 d119b324cb..046ea7216b 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
@@ -86,7 +86,7 @@ public class BeanRegistry {
                if (typeName.charAt(typeName.length() - 1) == '^') {
                        cm = getClassMeta(typeName.substring(0, 
typeName.length() - 1));
                        if (nn(cm)) {
-                               cm = 
bc.getClassMeta(Array.newInstance(cm.innerClass, 1).getClass());
+                               cm = 
bc.getClassMeta(Array.newInstance(cm.inner(), 1).getClass());
                                map.put(typeName, cm);
                        }
                        return cm;
@@ -101,7 +101,7 @@ public class BeanRegistry {
         * @return The dictionary name for the specified class in this 
registry, or <jk>null</jk> if not found.
         */
        public String getTypeName(ClassMeta<?> c) {
-               return isEmpty ? null : reverseMap.get(c.innerClass);
+               return isEmpty ? null : reverseMap.get(c.inner());
        }
 
        /**
@@ -169,7 +169,7 @@ public class BeanRegistry {
 
        private void addToMap(String typeName, ClassMeta<?> cm) {
                map.put(typeName, cm);
-               reverseMap.put(cm.innerClass, typeName);
+               reverseMap.put(cm.inner(), typeName);
        }
 
        private ClassMeta<?> getTypedClassMeta(Object array) {
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 fe81dd4177..91d083c0aa 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
@@ -1172,7 +1172,7 @@ public class BeanSession extends ContextSession {
                        if (to.isOptional() && (! (value instanceof Optional)))
                                return (T)opt(convertToMemberType(outer, value, 
to.getElementType()));
 
-                       var tc = to.getInnerClass();
+                       var tc = to.inner();
 
                        // If no conversion needed, then just return the value.
                        // Don't include maps or collections, because child 
elements may need conversion.
@@ -1198,7 +1198,7 @@ public class BeanSession extends ContextSession {
                        if (nn(swap)) {
                                var nc = swap.getNormalClass();
                                var fc = swap.getSwapClass();
-                               if (nc.isParentOf(from.getInnerClass()) && 
fc.isParentOf(tc))
+                               if (nc.isParentOf(from.inner()) && 
fc.isParentOf(tc))
                                        return (T)swap.swap(this, value);
                        }
 
@@ -1505,7 +1505,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.innerClass))
+                                               if (nn(cm) && 
to.isParentOf(cm.inner()))
                                                        return (T)m2.cast(cm);
                                        }
                                }
@@ -1554,7 +1554,7 @@ public class BeanSession extends ContextSession {
                                return 
(T)GregorianCalendar.from(GranularZonedDateTime.of(value.toString()).getZonedDateTime());
                        }
 
-                       if (to.isDate() && to.getInnerClass() == Date.class) {
+                       if (to.isDate() && to.inner() == Date.class) {
                                if (from.isCalendar())
                                        return (T)((Calendar)value).getTime();
                                return 
(T)GregorianCalendar.from(GranularZonedDateTime.of(value.toString()).getZonedDateTime()).getTime();
@@ -1567,7 +1567,7 @@ public class BeanSession extends ContextSession {
                                return from.mutateTo(value, to);
 
                        if (to.isBean())
-                               return 
newBeanMap(to.getInnerClass()).load(value.toString()).getBean();
+                               return 
newBeanMap(to.inner()).load(value.toString()).getBean();
 
                        if (to.canCreateNewInstanceFromString(outer))
                                return to.newInstanceFromString(outer, 
value.toString());
@@ -1649,11 +1649,11 @@ public class BeanSession extends ContextSession {
                if (list == null)
                        return null;
                var componentType = type.isArgs() ? object() : 
type.getElementType();
-               var array = Array.newInstance(componentType.getInnerClass(), 
list.size());
+               var array = Array.newInstance(componentType.inner(), 
list.size());
                var i = IntegerValue.create();
                list.forEach(x -> {
                        var x2 = x;
-                       if (! type.getInnerClass().isInstance(x)) {
+                       if (! type.inner().isInstance(x)) {
                                if (componentType.isArray() && x instanceof 
Collection<?> c)
                                        x2 = toArray(componentType, c);
                                else if (x == null && 
componentType.isPrimitive())
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseSession.java
index 6c3aa5e6d3..040b3820f7 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseSession.java
@@ -360,7 +360,7 @@ public class BeanTraverseSession extends BeanSession {
                if (o == null)
                        return null;
                var c = o.getClass();
-               var cm = (nn(eType) && c == eType.getInnerClass()) ? eType : 
((o instanceof ClassMeta) ? (ClassMeta<?>)o : getClassMeta(c));
+               var cm = (nn(eType) && c == eType.inner()) ? eType : ((o 
instanceof ClassMeta) ? (ClassMeta<?>)o : getClassMeta(c));
                if (cm.isCharSequence() || cm.isNumber() || cm.isBoolean())
                        return cm;
                if (depth > getMaxDepth())
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 8aaab53fdf..40e825c4df 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
@@ -35,7 +35,6 @@ import java.util.function.*;
 
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.commons.collections.*;
-import org.apache.juneau.commons.function.*;
 import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.commons.utils.*;
 import org.apache.juneau.cp.*;
@@ -69,116 +68,6 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
 
        private static final AnnotationProvider AP = 
AnnotationProvider.INSTANCE;
 
-       @SuppressWarnings({ "unchecked", "rawtypes", "hiding" })
-       private class ClassMetaBuilder<T> {
-               Class<T> innerClass;
-               BeanContext beanContext;
-               ConstructorInfo noArgConstructor = null;
-               ClassMeta<?> keyType = null, valueType = null, elementType = 
null;
-               String typePropertyName = null, notABeanReason = null;
-               Throwable initException = null;
-               BeanMeta beanMeta = null;
-               InvocationHandler invocationHandler = null;
-               BeanRegistry beanRegistry = null;
-
-               ClassMetaBuilder(ClassInfo ci, Class<T> innerClass, BeanContext 
beanContext) {
-                       this.innerClass = innerClass;
-                       this.beanContext = beanContext;
-                       var bc = beanContext;
-                       var ap = bc.getAnnotationProvider();
-
-                       Class c = ClassMeta.this.inner();
-
-                       // Find constructor(String) method if present.
-                       ci.getPublicConstructors().stream().filter(cs -> 
cs.isPublic() && cs.isNotDeprecated()).forEach(cs -> {
-                               var params = cs.getParameters();
-                               if (params.size() == (ci.isMemberClass() && 
ci.isNotStatic() ? 1 : 0) && c != Object.class && ! (ci.isAbstract() && 
ci.isNotPrimitive())) {
-                                       noArgConstructor = cs;
-                               }
-                       });
-
-                       if (innerClass != Object.class) {
-                               var x = implClass2.get() == null ? ci : 
implClass2.get();
-                               noArgConstructor = x.getPublicConstructor(cons 
-> cons.getParameterCount() == 0).orElse(null);
-                       }
-
-                       try {
-
-                               // If this is an array, get the element type.
-                               if (cat.is(ARRAY))
-                                       elementType = 
findClassMeta(innerClass.getComponentType());
-
-                               // If this is a MAP, see if it's parameterized 
(e.g. AddressBook extends HashMap<String,Person>)
-                               else if (cat.is(MAP) && ! cat.is(BEANMAP)) {
-                                       ClassMeta[] parameters = 
findParameters();
-                                       if (nn(parameters) && parameters.length 
== 2) {
-                                               keyType = parameters[0];
-                                               valueType = parameters[1];
-                                       } else {
-                                               keyType = 
findClassMeta(Object.class);
-                                               valueType = 
findClassMeta(Object.class);
-                                       }
-                               }
-
-                               // If this is a COLLECTION, see if it's 
parameterized (e.g. AddressBook extends LinkedList<Person>)
-                               else if (cat.is(COLLECTION) || 
ci.is(Optional.class)) {
-                                       ClassMeta[] parameters = 
findParameters();
-                                       if (nn(parameters) && parameters.length 
== 1) {
-                                               elementType = parameters[0];
-                                       } else {
-                                               elementType = 
findClassMeta(Object.class);
-                                       }
-                               }
-
-                               // If the category is unknown, see if it's a 
bean.
-                               // Note that this needs to be done after all 
other initialization has been done.
-                               if (cat.isUnknown()) {
-
-                                       var newMeta = (BeanMeta)null;
-                                       try {
-                                               newMeta = new 
BeanMeta(ClassMeta.this, bc, beanFilter.get(), null, implClass2.get() == null ? 
null : noArgConstructor);
-                                               notABeanReason = 
newMeta.notABeanReason;
-
-                                               // Always get these even if 
it's not a bean:
-                                               beanRegistry = 
newMeta.beanRegistry;
-                                               typePropertyName = 
newMeta.typePropertyName;
-
-                                       } catch (RuntimeException e) {
-                                               notABeanReason = e.getMessage();
-                                               throw e;
-                                       }
-                                       if (notABeanReason == null)
-                                               beanMeta = newMeta;
-                               }
-
-                       } catch (NoClassDefFoundError e) {
-                               initException = e;
-                       } catch (RuntimeException e) {
-                               initException = e;
-                               throw e;
-                       }
-
-                       if (nn(beanMeta) && nn(bc) && 
bc.isUseInterfaceProxies() && innerClass.isInterface())
-                               invocationHandler = new 
BeanProxyInvocationHandler<T>(beanMeta);
-
-                       if (nn(bc)) {
-                               ap.find(Bean.class, 
ci).stream().map(AnnotationInfo::inner).forEach(x -> {
-                                       if (x.dictionary().length != 0)
-                                               beanRegistry = new 
BeanRegistry(bc, null, x.dictionary());
-                               });
-                       }
-               }
-
-               private ClassMeta<?> findClassMeta(Class<?> c) {
-                       return beanContext.getClassMeta(c, false);
-               }
-
-               private ClassMeta<?>[] findParameters() {
-                       return beanContext.findParameters(innerClass, 
innerClass);
-               }
-
-       }
-
        enum Category {
                MAP(0),
                COLLECTION(1),
@@ -281,8 +170,6 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
                // @formatter:on
        }
 
-       final Class<T> innerClass;                              // The class 
being wrapped.
-       final ClassInfo info;
        private final Categories cat;                         // The class 
category.
        private final ObjectSwap<?,?>[] childSwaps;              // Any 
ObjectSwaps where the normal type is a subclass of this class.
        private final ConcurrentHashMap<Class<?>,ObjectSwap<?,?>> childSwapMap; 
                                       // Maps normal subclasses to ObjectSwaps.
@@ -295,7 +182,6 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
        private final BeanMeta<T> beanMeta;                     // The bean 
meta for this bean class (if it's a bean).
        private final String typePropertyName;                                  
  // The property name of the _type property for this class and subclasses.
        private final String notABeanReason;                                    
  // If this isn't a bean, the reason why.
-       private final Throwable initException;                  // Any 
exceptions thrown in the init() method.
        private final InvocationHandler invocationHandler;      // The 
invocation handler for this class (if it has one).
        private final BeanRegistry beanRegistry;                // The bean 
registry of this class meta (if it has one).
        private final ClassMeta<?>[] args;                      // Arg types if 
this is an array of args.
@@ -303,62 +189,12 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
        private final Map<Class<?>,Mutater<T,?>> toMutaters = new 
ConcurrentHashMap<>();
        private final Mutater<String,T> stringMutater;
        private final Map<Class<?>,Annotation[]> annotationArrayMap = new 
ConcurrentHashMap<>();
-
        private final Map<Class<?>,Optional<?>> annotationLastMap = new 
ConcurrentHashMap<>();
-
        private final Map<String,Optional<?>> properties = new 
ConcurrentHashMap<>();
-
        private final SimpleReadWriteLock lock = new SimpleReadWriteLock(false);
 
-       private final Supplier<String> typePropertyName2;                       
             // The property name of the _type property for this class and 
subclasses.
-
-       private String findTypePropertyName() {
-               var b = beanMeta2.get();
-               if (b.getA() != null)
-                       return b.getA().typePropertyName;
-               return null;
-       }
-
-       private final Supplier<Tuple2<BeanMeta<T>,String>> beanMeta2;
-
-       private Tuple2<BeanMeta<T>,String> findBeanMeta() {
-               if (! cat.isUnknown())
-                       return new Tuple2<>(null, "Known non-bean type");
-               if (beanContext == null)
-                       return new Tuple2<>(null, "No bean context");
-
-               BeanMeta<T> newMeta = null;
-               String notABeanReason = null;
-               try {
-                       newMeta = new BeanMeta<>(ClassMeta.this, beanContext, 
beanFilter.get(), null, implClass2.get() == null ? null : 
noArgConstructor.get());
-                       notABeanReason = newMeta.notABeanReason;
-               } catch (RuntimeException e) {
-                       notABeanReason = e.getMessage();
-                       throw e;
-               }
-               return Tuple2.of(newMeta, notABeanReason);
-       }
-
-       private final Supplier<BeanRegistry> beanRegistry2;                // 
The bean registry of this class meta (if it has one).
        private final Supplier<String> dictionaryName;                          
            // The dictionary name of this class if it has one.
 
-       private BeanRegistry findBeanRegistry() {
-               if (beanContext == null)
-                       return null;
-
-               var b = beanMeta2.get();
-               if (b.getA() != null)
-                       return b.getA().beanRegistry;
-
-               return beanContext.getAnnotationProvider().find(Bean.class, 
this)
-                       .stream()
-                       .map(AnnotationInfo::inner)
-                       .filter(x -> x.dictionary().length > 0)
-                       .map(x -> new BeanRegistry(beanContext, null, 
x.dictionary()))
-                       .findFirst()
-                       .orElse(null);
-       }
-
        private String findBeanDictionaryName() {
                if (beanContext == null)
                        return null;
@@ -481,7 +317,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
 
        private ConstructorInfo findNoArgConstructor() {
 
-               if (is(Object.class) || isAbstract())
+               if (is(Object.class))
                        return null;
 
                if (implClass2.get() != null)
@@ -549,6 +385,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
 
        private final Supplier<String> example;                           // 
Example JSON.
 
+       @SuppressWarnings("unchecked")
        private String findExample() {
 
                var example = opt(beanFilter.get()).map(x -> 
x.getExample()).orElse(null);
@@ -567,7 +404,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
                        } else if (cat.is(CHARSEQ)) {
                                example = "foo";
                        } else if (cat.is(ENUM)) {
-                               Iterator<? extends Enum<?>> i = 
EnumSet.allOf((Class<? extends Enum>)(Class)inner()).iterator();
+                               Iterator<? extends Enum<?>> i = 
EnumSet.allOf(inner().asSubclass(Enum.class)).iterator();
                                example = i.hasNext() ? 
(beanContext.isUseEnumNames() ? i.next().name() : i.next().toString()) : null;
                        } else if (isAny(float.class, Float.class, 
double.class, Double.class)) {
                                example = "1.0";
@@ -595,10 +432,6 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
                return (ClassInfoTyped<? extends T>)v;
        }
 
-       private final ClassMeta<?> elementType2;                                
         // If ARRAY or COLLECTION, the element class type.
-       private final ClassMeta<?> keyType2;                                    
         // If MAP, the key class type.
-       private final ClassMeta<?> valueType2;                                  
         // If MAP, the value class type.
-
        private final Supplier<BidiMap<Object,String>> enumValues;
 
        private BidiMap<Object,String> findEnumValues() {
@@ -609,7 +442,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
                var useEnumNames = nn(bc) && bc.isUseEnumNames();
 
                var m = BidiMap.<Object,String>create().unmodifiable();
-               var c = (Class<? extends Enum<?>>)(Class)inner();
+               var c = inner().asSubclass(Enum.class);
                stream(c.getEnumConstants()).forEach(x -> m.add(x, useEnumNames 
? x.name() : x.toString()));
                return m.build();
        }
@@ -637,8 +470,6 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
        @SuppressWarnings("unchecked")
        ClassMeta(Class<T> innerClass, BeanContext beanContext, 
ObjectSwap<T,?>[] swaps, ObjectSwap<?,?>[] childSwaps) {
                super(innerClass);
-               this.innerClass = innerClass;
-               this.info = info(innerClass);
                this.beanContext = beanContext;
                this.cat = new Categories();
                var notABeanReason = (String)null;
@@ -713,7 +544,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
                        var _valueType = (ClassMeta<?>)null;
 
                        if (cat.is(ARRAY)) {
-                               _elementType = 
beanContext.getClassMeta(getComponentType().inner(), false);
+                               _elementType = 
beanContext.getClassMeta(inner().getComponentType(), false);
                        } else if (cat.is(MAP) && ! cat.is(BEANMAP)) {
                                // If this is a MAP, see if it's parameterized 
(e.g. AddressBook extends HashMap<String,Person>)
                                var parameters = 
beanContext.findParameters(inner(), inner());
@@ -734,18 +565,32 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
                                }
                        }
 
-                       this.elementType2 = _elementType;
-                       this.keyType2 = _keyType;
-                       this.valueType2 = _valueType;
+                       BeanMeta<T> _beanMeta = null;
+                       var _beanRegistry = new Value<BeanRegistry>();
+
+                       if (! cat.isUnknown()) {
+                               notABeanReason = "Known non-bean type";
+                       } else {
+                               try {
+                                       _beanMeta = new 
BeanMeta<>(ClassMeta.this, beanContext, beanFilter.get(), null, 
implClass2.get() == null ? null : noArgConstructor.get());
+                                       notABeanReason = 
_beanMeta.notABeanReason;
+                                       
_beanRegistry.set(_beanMeta.beanRegistry);
+                               } catch (RuntimeException e) {
+                                       notABeanReason = e.getMessage();
+                               }
+                       }
 
-                       var builder = new ClassMetaBuilder<>(info, innerClass, 
beanContext);
+                       ap.find(Bean.class, 
this).stream().map(AnnotationInfo::inner).forEach(x2 -> {
+                               if (x2.dictionary().length != 0)
+                                       _beanRegistry.set(new 
BeanRegistry(beanContext, null, x2.dictionary()));
+                       });
 
+                       this.beanMeta = notABeanReason == null ? _beanMeta : 
null;
+                       this.keyType = _keyType;
+                       this.valueType = _valueType;
+                       this.elementType = _elementType;
                        this.enumValues = memoize(()->findEnumValues());
-                       this.beanRegistry2 = memoize(()->findBeanRegistry());
                        this.dictionaryName = 
memoize(()->findBeanDictionaryName());
-                       this.beanMeta2 = memoize(()->findBeanMeta());
-                       this.typePropertyName2 = 
memoize(()->findTypePropertyName());
-
 
                        var _swaps = new ArrayList<ObjectSwap<T,?>>();
                        if (swaps != null)
@@ -767,25 +612,16 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
                                _swaps.add((ObjectSwap<T,?>)ds);
 
                        this.swaps = _swaps.isEmpty() ? null : 
_swaps.toArray(new ObjectSwap[_swaps.size()]);
-                       this.keyType = builder.keyType;
-                       this.valueType = builder.valueType;
-                       this.elementType = builder.elementType;
-                       notABeanReason = builder.notABeanReason;
-                       this.beanMeta = builder.beanMeta;
-                       this.initException = builder.initException;
-                       this.typePropertyName = builder.typePropertyName;
-                       this.invocationHandler = builder.invocationHandler;
-                       this.beanRegistry = builder.beanRegistry;
+                       this.typePropertyName = opt(beanMeta).map(x2 -> 
x2.typePropertyName).orElse(null);
+
+                       this.invocationHandler = (nn(beanMeta) && 
beanContext.isUseInterfaceProxies() && isInterface()) ? new 
BeanProxyInvocationHandler<>(beanMeta) : null;
+                       this.beanRegistry = _beanRegistry.get();
 
                        this.childSwaps = childSwaps;
                        this.childUnswapMap = childSwaps == null ? null : new 
ConcurrentHashMap<>();
                        this.childSwapMap = childSwaps == null ? null : new 
ConcurrentHashMap<>();
                        this.args = null;
                        this.stringMutater = Mutaters.get(String.class, 
inner());
-               } catch (ClassMetaRuntimeException e) {
-                       notABeanReason = e.getMessage();
-                       throw e;
-               } finally {
                        this.notABeanReason = notABeanReason;
                }
        }
@@ -796,8 +632,6 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
        @SuppressWarnings("unchecked")
        ClassMeta(ClassMeta<?>[] args) {
                super((Class<T>)Object[].class);
-               this.innerClass = (Class<T>)Object[].class;
-               this.info = info(innerClass);
                this.args = args;
                this.childSwaps = null;
                this.childSwapMap = null;
@@ -812,7 +646,6 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
                this.typePropertyName = null;
                this.notABeanReason = null;
                this.swaps = null;
-               this.initException = null;
                this.beanRegistry = null;
                this.stringMutater = null;
                this.fromStringMethod = memoize(()->findFromStringMethod());
@@ -827,14 +660,8 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
                this.builderSwap = memoize(()->findBuilderSwap());
                this.example = memoize(()->findExample());
                this.implClass2 = memoize(()->findImplClass());
-               this.elementType2 = null;
-               this.keyType2 = null;
-               this.valueType2 = null;
                this.enumValues = memoize(()->findEnumValues());
-               this.beanRegistry2 = memoize(()->findBeanRegistry());
                this.dictionaryName = memoize(()->findBeanDictionaryName());
-               this.beanMeta2 = memoize(()->findBeanMeta());
-               this.typePropertyName2 = memoize(()->findTypePropertyName());
        }
 
        /**
@@ -844,10 +671,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
         * Used for creating Map and Collection class metas that shouldn't be 
cached.
         */
        ClassMeta(ClassMeta<T> mainType, ClassMeta<?> keyType, ClassMeta<?> 
valueType, ClassMeta<?> elementType) {
-               super(mainType.innerClass);
-               this.innerClass = mainType.innerClass;
-               this.info = mainType.info;
-//             this.implClass = mainType.implClass;
+               super(mainType.inner());
                this.childSwaps = mainType.childSwaps;
                this.childSwapMap = mainType.childSwapMap;
                this.childUnswapMap = mainType.childUnswapMap;
@@ -860,16 +684,12 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
                this.invocationHandler = mainType.invocationHandler;
                this.beanMeta = mainType.beanMeta;
                this.typePropertyName = mainType.typePropertyName;
-//             this.dictionaryName = mainType.dictionaryName;
                this.notABeanReason = mainType.notABeanReason;
                this.swaps = mainType.swaps;
-               this.initException = mainType.initException;
                this.beanRegistry = mainType.beanRegistry;
                this.exampleMethod = mainType.exampleMethod;
-//             this.example = mainType.example;
                this.args = null;
                this.stringMutater = mainType.stringMutater;
-//             this.enumValues = mainType.enumValues;
                this.parentPropertySetter = mainType.parentPropertySetter;
                this.namePropertySetter = mainType.namePropertySetter;
                this.exampleField = mainType.exampleField;
@@ -880,16 +700,11 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
                this.builderSwap = mainType.builderSwap;
                this.example = mainType.example;
                this.implClass2 = mainType.implClass2;
-               this.elementType2 = mainType.elementType2;
-               this.keyType2 = mainType.keyType2;
-               this.valueType2 = mainType.valueType2;
                this.enumValues = mainType.enumValues;
-               this.beanRegistry2 = mainType.beanRegistry2;
                this.dictionaryName = mainType.dictionaryName;
-               this.beanMeta2 = mainType.beanMeta2;
-               this.typePropertyName2 = mainType.typePropertyName2;
        }
 
+       @SuppressWarnings("unchecked")
        private ObjectSwap<T,?> createSwap(Swap s) {
                var c = s.value();
                if (ClassUtils.isVoid(c))
@@ -982,7 +797,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
 
        @Override /* Overridden from Object */
        public boolean equals(Object o) {
-               return (o instanceof ClassMeta<?> o2) && eq(this, o2, (x, y) -> 
eq(x.innerClass, y.innerClass));
+               return (o instanceof ClassMeta<?>) && super.equals(o);
        }
 
        /**
@@ -1130,7 +945,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
                        } else if (super.isArray()) {
                                var etExample = 
getElementType().getExample(session, jpSession);
                                if (nn(etExample)) {
-                                       var o = 
Array.newInstance(getElementType().innerClass, 1);
+                                       var o = 
Array.newInstance(getElementType().inner(), 1);
                                        Array.set(o, 0, etExample);
                                        return (T)o;
                                }
@@ -1166,7 +981,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
                if (t == Mutaters.NULL)
                        return null;
                if (t == null) {
-                       t = Mutaters.get(c, innerClass);
+                       t = Mutaters.get(c, inner());
                        if (t == null)
                                t = Mutaters.NULL;
                        fromMutaters.put(c, t);
@@ -1186,20 +1001,6 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
                return null;
        }
 
-       /**
-        * Returns any exception that was throw in the <c>init()</c> method.
-        *
-        * @return The cached exception.
-        */
-       public Throwable getInitException() { return initException; }
-
-       /**
-        * Returns the {@link Class} object that this class type wraps.
-        *
-        * @return The wrapped class object.
-        */
-       public Class<T> getInnerClass() { return innerClass; }
-
        /**
         * Returns the transform for this class for creating instances from an 
InputStream.
         *
@@ -1317,13 +1118,6 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
                return (ps == null ? this : ps.getSwapClassMeta(session));
        }
 
-       /**
-        * Shortcut for calling {@link Class#getSimpleName()} on the inner 
class of this metadata.
-        *
-        * @return The simple name of the inner class.
-        */
-       public String getSimpleName() { return innerClass.getSimpleName(); }
-
        /**
         * Returns the transform for this class for creating instances from a 
String.
         *
@@ -1374,7 +1168,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
                if (t == Mutaters.NULL)
                        return null;
                if (t == null) {
-                       t = Mutaters.get(innerClass, c);
+                       t = Mutaters.get(inner(), c);
                        if (t == null)
                                t = Mutaters.NULL;
                        toMutaters.put(c, t);
@@ -1425,7 +1219,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
         * @return <jk>true</jk> if this class can be instantiated from the 
specified type.
         */
        public boolean hasMutaterFrom(ClassMeta<?> c) {
-               return nn(getFromMutater(c.getInnerClass()));
+               return nn(getFromMutater(c.inner()));
        }
 
        /**
@@ -1445,7 +1239,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
         * @return <jk>true</jk> if this class can be transformed to the 
specified type.
         */
        public boolean hasMutaterTo(ClassMeta<?> c) {
-               return nn(getToMutater(c.getInnerClass()));
+               return nn(getToMutater(c.inner()));
        }
 
        /**
@@ -1648,7 +1442,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
         * @return <jk>true</jk> if instance of this class can be null.
         */
        public boolean isNullable() {
-               if (innerClass.isPrimitive())
+               if (isPrimitive())
                        return is(char.class);
                return true;
        }
@@ -1674,14 +1468,6 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
         */
        public boolean isOptional() { return is(Optional.class); }
 
-       /**
-        * Returns <jk>true</jk> if this class is a primitive.
-        *
-        * @return <jk>true</jk> if this class is a primitive.
-        */
-       @Override
-       public boolean isPrimitive() { return innerClass.isPrimitive(); }
-
        /**
         * Returns <jk>true</jk> if this class is a {@link Reader}.
         *
@@ -1765,10 +1551,10 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
         * @param c The class
         * @return The transformed object.
         */
-       @SuppressWarnings({ "unchecked", "rawtypes" })
+       @SuppressWarnings({ "unchecked" })
        public <O> O mutateTo(Object o, Class<O> c) {
                Mutater<Object,O> t = (Mutater<Object,O>)getToMutater(c);
-               return (O)(t == null ? null : t.mutate(o));
+               return t == null ? null : t.mutate(o);
        }
 
        /**
@@ -1780,7 +1566,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
         * @return The transformed object.
         */
        public <O> O mutateTo(Object o, ClassMeta<O> c) {
-               return mutateTo(o, c.getInnerClass());
+               return mutateTo(o, c.inner());
        }
 
        /**
@@ -1793,13 +1579,13 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
        @SuppressWarnings("unchecked")
        public T newInstance() throws ExecutableException {
                if (super.isArray())
-                       return 
(T)Array.newInstance(getInnerClass().getComponentType(), 0);
+                       return (T)Array.newInstance(inner().getComponentType(), 
0);
                var c = getConstructor();
                if (nn(c))
                        return c.<T>newInstance();
                var h = getProxyInvocationHandler();
                if (nn(h))
-                       return 
(T)Proxy.newProxyInstance(this.getClass().getClassLoader(), a(getInnerClass(), 
java.io.Serializable.class), h);
+                       return 
(T)Proxy.newProxyInstance(this.getClass().getClassLoader(), a(inner(), 
java.io.Serializable.class), h);
                return null;
        }
 
@@ -1841,7 +1627,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
                if (isEnum()) {
                        var t = (T)enumValues.get().getKey(arg);
                        if (t == null && ! 
beanContext.isIgnoreUnknownEnumValues())
-                               throw new ExecutableException("Could not 
resolve enum value ''{0}'' on class ''{1}''", arg, getInnerClass().getName());
+                               throw new ExecutableException("Could not 
resolve enum value ''{0}'' on class ''{1}''", arg, inner().getName());
                        return t;
                }
 
@@ -1855,7 +1641,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
                                return c.<T>newInstance(outer, arg);
                        return c.<T>newInstance(arg);
                }
-               throw new ExecutableException("No string constructor or 
valueOf(String) method found for class '" + getInnerClass().getName() + "'");
+               throw new ExecutableException("No string constructor or 
valueOf(String) method found for class '" + inner().getName() + "'");
        }
 
        /**
@@ -1986,7 +1772,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
         * @return The passed-in string builder.
         */
        protected StringBuilder toString(StringBuilder sb, boolean simple) {
-               var n = innerClass.getName();
+               var n = inner().getName();
                if (simple) {
                        var i = n.lastIndexOf('.');
                        n = n.substring(i == -1 ? 0 : i + 1).replace('$', '.');
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ExtendedClassMeta.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ExtendedClassMeta.java
index 6cee5255a0..ac35f4c656 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ExtendedClassMeta.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ExtendedClassMeta.java
@@ -48,5 +48,5 @@ public class ExtendedClassMeta extends ExtendedMeta {
         *
         * @return The class wrapped by this metadata.
         */
-       protected Class<?> getInnerClass() { return cm.getInnerClass(); }
+       protected Class<?> getInnerClass() { return cm.inner(); }
 }
\ No newline at end of file
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 a2d7900aba..645fbd4f2f 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.getInnerClass()))
+               if (c2 == null || c2.isParentOf(c1.inner()))
                        return c1;
                return c2;
        }
@@ -1795,7 +1795,7 @@ public class JsonMap extends LinkedHashMap<String,Object> 
{
                                return (T)m2;
 
                        } else if (cm.isBean()) {
-                               BeanMap<? extends T> bm = 
bs.newBeanMap(cm.getInnerClass());
+                               BeanMap<? extends T> bm = 
bs.newBeanMap(cm.inner());
 
                                // Iterate through all the entries in the map 
and set the individual field values.
                                forEach((k, v) -> {
@@ -1820,10 +1820,10 @@ public class JsonMap extends 
LinkedHashMap<String,Object> {
                        }
 
                } catch (Exception e) {
-                       throw bex(e, cm.getInnerClass(), "Error occurred 
attempting to cast to an object of type ''{0}''", cm.getInnerClass().getName());
+                       throw bex(e, cm.inner(), "Error occurred attempting to 
cast to an object of type ''{0}''", cm.inner().getName());
                }
 
-               throw bex(cm.getInnerClass(), "Cannot convert to class type 
''{0}''.  Only beans and maps can be converted using this method.", 
cm.getInnerClass().getName());
+               throw bex(cm.inner(), "Cannot convert to class type ''{0}''.  
Only beans and maps can be converted using this method.", cm.inner().getName());
        }
 
        private ObjectRest getObjectRest() {
@@ -1845,11 +1845,11 @@ public class JsonMap extends 
LinkedHashMap<String,Object> {
                if (c1.isMap()) {
                        ClassMeta<?> k = getNarrowedClassMeta(c1.getKeyType(), 
c2.getKeyType());
                        ClassMeta<?> v = 
getNarrowedClassMeta(c1.getValueType(), c2.getValueType());
-                       return bs().getClassMeta(c.getInnerClass(), k, v);
+                       return bs().getClassMeta(c.inner(), k, v);
                }
                if (c1.isCollection()) {
                        ClassMeta<?> e = 
getNarrowedClassMeta(c1.getElementType(), c2.getElementType());
-                       return bs().getClassMeta(c.getInnerClass(), e);
+                       return bs().getClassMeta(c.inner(), e);
                }
                return c;
        }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserSession.java
index cbd28d67ac..56f381efa1 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserSession.java
@@ -260,7 +260,7 @@ public class HtmlParserSession extends XmlParserSession {
                        var nameProperty = Value.<String>empty();
                        beanType.forEachAnnotation(HtmlLink.class, x -> 
isNotEmpty(x.uriProperty()), x -> uriProperty.set(x.uriProperty()));
                        beanType.forEachAnnotation(HtmlLink.class, x -> 
isNotEmpty(x.nameProperty()), x -> nameProperty.set(x.nameProperty()));
-                       BeanMap<T> m = newBeanMap(beanType.getInnerClass());
+                       BeanMap<T> m = newBeanMap(beanType.inner());
                        m.put(uriProperty.orElse(""), href);
                        m.put(nameProperty.orElse(""), name);
                        return m.getBean();
@@ -337,7 +337,7 @@ public class HtmlParserSession extends XmlParserSession {
                        else if (sType.isBoolean())
                                o = Boolean.parseBoolean(text);
                        else if (sType.isNumber())
-                               o = parseNumber(text, (Class<? extends 
Number>)eType.getInnerClass());
+                               o = parseNumber(text, (Class<? extends 
Number>)eType.inner());
                        else if (sType.canCreateNewInstanceFromString(outer))
                                o = sType.newInstanceFromString(outer, text);
                        else
@@ -360,7 +360,7 @@ public class HtmlParserSession extends XmlParserSession {
                        if (sType.isObject())
                                o = parseNumber(text, Number.class);
                        else if (sType.isNumber())
-                               o = parseNumber(text, (Class<? extends 
Number>)sType.getInnerClass());
+                               o = parseNumber(text, (Class<? extends 
Number>)sType.inner());
                        else
                                isValid = false;
                        skipTag(r, xNUMBER);
@@ -409,10 +409,10 @@ public class HtmlParserSession extends XmlParserSession {
                                        BeanMap m = 
toBeanMap(builder.create(this, eType));
                                        o = builder.build(this, 
parseIntoBean(r, m).getBean(), eType);
                                } else if (sType.canCreateNewBean(outer)) {
-                                       BeanMap m = newBeanMap(outer, 
sType.getInnerClass());
+                                       BeanMap m = newBeanMap(outer, 
sType.inner());
                                        o = parseIntoBean(r, m).getBean();
                                } else if 
(nn(sType.getProxyInvocationHandler())) {
-                                       BeanMap m = newBeanMap(outer, 
sType.getInnerClass());
+                                       BeanMap m = newBeanMap(outer, 
sType.inner());
                                        o = parseIntoBean(r, m).getBean();
                                } else {
                                        isValid = false;
@@ -599,7 +599,7 @@ public class HtmlParserSession extends XmlParserSession {
                                BeanMap m =
                                        nn(builder)
                                        ? toBeanMap(builder.create(this, 
elementType))
-                                       : newBeanMap(l, 
elementType.getInnerClass())
+                                       : newBeanMap(l, elementType.inner())
                                ;
                                // @formatter:on
                                for (var key : keys) {
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
index 9c6ba9d842..e1a67acdc4 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
@@ -471,7 +471,7 @@ public class HtmlSerializerSession extends 
XmlSerializerSession {
                HtmlClassMeta cHtml = getHtmlClassMeta(sType);
                HtmlBeanPropertyMeta bpHtml = getHtmlBeanPropertyMeta(ppMeta);
 
-               Collection c = (sType.isCollection() ? (Collection)in : 
toList(sType.getInnerClass(), in));
+               Collection c = (sType.isCollection() ? (Collection)in : 
toList(sType.inner(), in));
 
                boolean isCdc = cHtml.isHtmlCdc() || bpHtml.isHtmlCdc();
                boolean isSdc = cHtml.isHtmlSdc() || bpHtml.isHtmlSdc();
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchema.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchema.java
index 72e20b51e8..b96717854e 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchema.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchema.java
@@ -3653,7 +3653,7 @@ public class HttpPartSchema {
                Class<?> parsedType = Object.class;
                if (type == ARRAY) {
                        if (nn(items))
-                               parsedType = 
Array.newInstance(items.parsedType.getInnerClass(), 0).getClass();
+                               parsedType = 
Array.newInstance(items.parsedType.inner(), 0).getClass();
                } else if (type == BOOLEAN) {
                        parsedType = Boolean.class;
                } else if (type == INTEGER) {
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/SimplePartParserSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/SimplePartParserSession.java
index e62a45d16d..c4b2cdf204 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/SimplePartParserSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/SimplePartParserSession.java
@@ -35,6 +35,6 @@ public class SimplePartParserSession extends 
BaseHttpPartParserSession {
 
        @Override /* Overridden from HttpPartParserSession */
        public <T> T parse(HttpPartType partType, HttpPartSchema schema, String 
in, ClassMeta<T> toType) throws ParseException, SchemaValidationException {
-               return Mutaters.fromString(toType.getInnerClass(), in);
+               return Mutaters.fromString(toType.inner(), in);
        }
 }
\ No newline at end of file
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/DelegateBeanMap.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/DelegateBeanMap.java
index e963461535..b5dacaab5b 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/DelegateBeanMap.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/DelegateBeanMap.java
@@ -84,7 +84,7 @@ public class DelegateBeanMap<T> extends BeanMap<T> {
                        else
                                bme = this.getProperty(k);
                        if (bme == null)
-                               throw bex(super.getClassMeta().getInnerClass(), 
"Property ''{0}'' not found on class.", k);
+                               throw bex(super.getClassMeta().inner(), 
"Property ''{0}'' not found on class.", k);
                        s.add(bme);
                });
                return s;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonParserSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonParserSession.java
index 33ef43ff89..09546a0711 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonParserSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonParserSession.java
@@ -263,7 +263,7 @@ public class JsonParserSession extends ReaderParserSession {
                } else if (sType.isChar()) {
                        o = parseCharacter(parseString(r));
                } else if (sType.isNumber()) {
-                       o = parseNumber(r, (Class<? extends 
Number>)sType.getInnerClass());
+                       o = parseNumber(r, (Class<? extends 
Number>)sType.inner());
                } else if (sType.isMap()) {
                        Map m = (sType.canCreateNewInstance(outer) ? 
(Map)sType.newInstance(outer) : newGenericMap(sType));
                        o = parseIntoMap2(r, m, sType.getKeyType(), 
sType.getValueType(), pMeta);
@@ -280,7 +280,7 @@ public class JsonParserSession extends ReaderParserSession {
                        var m = toBeanMap(builder.create(this, eType));
                        o = builder.build(this, parseIntoBeanMap2(r, 
m).getBean(), eType);
                } else if (sType.canCreateNewBean(outer)) {
-                       var m = newBeanMap(outer, sType.getInnerClass());
+                       var m = newBeanMap(outer, sType.inner());
                        o = parseIntoBeanMap2(r, m).getBean();
                } else if (sType.canCreateNewInstanceFromString(outer) && (c == 
'\'' || c == '"')) {
                        o = sType.newInstanceFromString(outer, parseString(r));
@@ -299,9 +299,9 @@ public class JsonParserSession extends ReaderParserSession {
                        if (m.containsKey(getBeanTypePropertyName(eType)))
                                o = cast((JsonMap)m, pMeta, eType);
                        else if (nn(sType.getProxyInvocationHandler()))
-                               o = newBeanMap(outer, 
sType.getInnerClass()).load(m).getBean();
+                               o = newBeanMap(outer, 
sType.inner()).load(m).getBean();
                        else
-                               throw new ParseException(this, "Class ''{0}'' 
could not be instantiated.  Reason: ''{1}''", sType.getInnerClass().getName(), 
sType.getNotABeanReason());
+                               throw new ParseException(this, "Class ''{0}'' 
could not be instantiated.  Reason: ''{1}''", sType.inner().getName(), 
sType.getNotABeanReason());
                } else if (sType.canCreateNewInstanceFromString(outer) && ! 
isStrict()) {
                        o = sType.newInstanceFromString(outer, parseString(r));
                } else {
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializerSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializerSession.java
index 961fba6aeb..dfc7483f08 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializerSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializerSession.java
@@ -416,7 +416,7 @@ public class JsonSerializerSession extends 
WriterSerializerSession {
                } else if (sType.isCollection()) {
                        serializeCollection(out, (Collection)o, eType);
                } else if (sType.isArray()) {
-                       serializeCollection(out, toList(sType.getInnerClass(), 
o), eType);
+                       serializeCollection(out, toList(sType.inner(), o), 
eType);
                } else if (sType.isReader()) {
                        pipe((Reader)o, out, SerializerSession::handleThrown);
                } else if (sType.isInputStream()) {
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/BasicBeanDefMapper.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/BasicBeanDefMapper.java
index 94770a3ed0..95236a8ad0 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/BasicBeanDefMapper.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/BasicBeanDefMapper.java
@@ -57,7 +57,7 @@ public class BasicBeanDefMapper implements BeanDefMapper {
 
        @Override /* Overridden from BeanDefMapper */
        public String getId(ClassMeta<?> cm) {
-               return cm.getSimpleName();
+               return cm.getNameSimple();
        }
 
        @Override /* Overridden from BeanDefMapper */
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGenerator.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGenerator.java
index c4e465eb80..bd0a5ea426 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGenerator.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGenerator.java
@@ -922,7 +922,7 @@ public class JsonSchemaGenerator extends 
BeanTraverseContext implements JsonSche
         */
        public boolean isIgnoredType(ClassMeta<?> cm) {
                for (var p : ignoreTypePatterns)
-                       if (p.matcher(cm.getSimpleName()).matches() || 
p.matcher(cm.getName()).matches())
+                       if (p.matcher(cm.getNameSimple()).matches() || 
p.matcher(cm.getName()).matches())
                                return true;
                return false;
        }
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 3d33f6079b..ab127d0deb 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
@@ -282,7 +282,7 @@ public class JsonSchemaGeneratorSession extends 
BeanTraverseSession {
        @SuppressWarnings("unchecked")
        private static List<String> getEnums(ClassMeta<?> cm) {
                List<String> l = list();
-               for (var e : 
((Class<Enum<?>>)cm.getInnerClass()).getEnumConstants())
+               for (var e : ((Class<Enum<?>>)cm.inner()).getEnumConstants())
                        l.add(cm.toString(e));
                return l;
        }
@@ -417,7 +417,7 @@ public class JsonSchemaGeneratorSession extends 
BeanTraverseSession {
 
                        if (tc == BEAN) {
                                var properties = new JsonMap();
-                               BeanMeta bm = 
getBeanMeta(sType.getInnerClass());
+                               BeanMeta bm = getBeanMeta(sType.inner());
                                if (nn(pNames))
                                        bm = new BeanMetaFiltered(bm, pNames);
                                for (Iterator<BeanPropertyMeta> i = 
bm.getPropertyMetas().iterator(); i.hasNext();) {
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackParserSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackParserSession.java
index e4c2c977ff..7897ee0f38 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackParserSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackParserSession.java
@@ -250,7 +250,7 @@ public class MsgPackParserSession extends 
InputStreamParserSession {
                                }
                        } else if (nn(builder) || 
sType.canCreateNewBean(outer)) {
                                if (dt == MAP) {
-                                       BeanMap m = builder == null ? 
newBeanMap(outer, sType.getInnerClass()) : toBeanMap(builder.create(this, 
eType));
+                                       BeanMap m = builder == null ? 
newBeanMap(outer, sType.inner()) : toBeanMap(builder.create(this, eType));
                                        for (var i = 0; i < length; i++) {
                                                String pName = 
parseAnything(string(), is, m.getBean(false), null);
                                                var bpm = 
m.getPropertyMeta(pName);
@@ -312,9 +312,9 @@ public class MsgPackParserSession extends 
InputStreamParserSession {
                                if 
(m.containsKey(getBeanTypePropertyName(eType)))
                                        o = cast(m, pMeta, eType);
                                else if (nn(sType.getProxyInvocationHandler()))
-                                       o = newBeanMap(outer, 
sType.getInnerClass()).load(m).getBean();
+                                       o = newBeanMap(outer, 
sType.inner()).load(m).getBean();
                                else
-                                       throw new ParseException(this, "Class 
''{0}'' could not be instantiated.  Reason: ''{1}''", 
sType.getInnerClass().getName(), sType.getNotABeanReason());
+                                       throw new ParseException(this, "Class 
''{0}'' could not be instantiated.  Reason: ''{1}''", sType.inner().getName(), 
sType.getNotABeanReason());
                        } else {
                                throw new ParseException(this, "Invalid data 
type {0} encountered for parse type {1}", dt, sType);
                        }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerSession.java
index 0702f9e0ba..7f66cedfc4 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerSession.java
@@ -273,7 +273,7 @@ public class MsgPackSerializerSession extends 
OutputStreamSerializerSession {
                } else if (sType.isByteArray()) {
                        out.appendBinary((byte[])o);
                } else if (sType.isArray()) {
-                       serializeCollection(out, toList(sType.getInnerClass(), 
o), eType);
+                       serializeCollection(out, toList(sType.inner(), o), 
eType);
                } else if (sType.isReader()) {
                        pipe((Reader)o, out, SerializerSession::handleThrown);
                } else if (sType.isInputStream()) {
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiParserSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiParserSession.java
index 38ef7a840c..aa3d5968c9 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiParserSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiParserSession.java
@@ -398,7 +398,7 @@ public class OpenApiParserSession extends UonParserSession {
                                var items = schema.getItems();
                                if (items == null)
                                        items = HttpPartSchema.DEFAULT;
-                               var o = 
Array.newInstance(eType.getInnerClass(), ss.length);
+                               var o = Array.newInstance(eType.inner(), 
ss.length);
                                for (var i = 0; i < ss.length; i++)
                                        Array.set(o, i, parse(partType, items, 
ss[i], eType));
                                if (type.hasMutaterFrom(schema.getParsedType()) 
|| schema.getParsedType().hasMutaterTo(type))
@@ -441,7 +441,7 @@ public class OpenApiParserSession extends UonParserSession {
                                }
 
                                if (type.isBean()) {
-                                       var m = 
ctx.getBeanContext().newBeanMap(type.getInnerClass());
+                                       var m = 
ctx.getBeanContext().newBeanMap(type.inner());
                                        for (var s : ss) {
                                                var kv = StringUtils.splita(s, 
'=', 2);
                                                if (kv.length != 2)
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserSession.java
index 862f5f0935..6928c91973 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserSession.java
@@ -756,7 +756,7 @@ public class ParserSession extends BeanSession {
                var cm = getClassMeta(typeName, pMeta, eType);
 
                if (nn(cm)) {
-                       var bm = 
m.getBeanSession().newBeanMap(cm.getInnerClass());
+                       var bm = m.getBeanSession().newBeanMap(cm.inner());
 
                        // Iterate through all the entries in the map and set 
the individual field values.
                        m.forEach((k, v) -> {
@@ -800,7 +800,7 @@ public class ParserSession extends BeanSession {
                if (sType.isChar())
                        o = parseCharacter(s);
                else if (sType.isNumber())
-                       o = parseNumber(s, (Class<? extends 
Number>)sType.getInnerClass());
+                       o = parseNumber(s, (Class<? extends 
Number>)sType.inner());
                else if (sType.isBoolean())
                        o = Boolean.parseBoolean(s);
                else if (! (sType.isCharSequence() || sType.isObject())) {
@@ -1074,7 +1074,7 @@ public class ParserSession extends BeanSession {
                        if (nn(value) || ! isIgnoreUnknownNullBeanProperties())
                                throw new ParseException(this, "Unknown 
property ''{0}'' encountered while trying to parse into class ''{1}''", 
propertyName, beanMap.getClassMeta());
                if (nn(listener))
-                       listener.onUnknownBeanProperty(this, propertyName, 
beanMap.getClassMeta().getInnerClass(), beanMap.getBean());
+                       listener.onUnknownBeanProperty(this, propertyName, 
beanMap.getClassMeta().inner(), beanMap.getBean());
        }
 
        @Override /* Overridden from ContextSession */
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 a80f75e926..ebbab39da9 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
@@ -385,7 +385,7 @@ public class ParserSet {
                }
 
                private Object createBuilder(Object o) {
-                       if (o instanceof Class o2) {
+                       if (o instanceof Class<?> o2) {
 
                                // Check for no-arg constructor.
                                var ci = info(o2).getPublicConstructor(c -> 
c.getParameterCount() == 0).orElse(null);
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 6f155116d5..434f862864 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
@@ -381,7 +381,7 @@ public class SerializerSet {
                }
 
                private Object createBuilder(Object o) {
-                       if (o instanceof Class o2) {
+                       if (o instanceof Class<?> o2) {
 
                                // Check for no-arg constructor.
                                var ci = info(o2).getPublicConstructor(c -> 
c.getParameterCount() == 0).orElse(null);
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swaps/InputStreamSwap.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swaps/InputStreamSwap.java
index 51dd3a6d73..7e61948657 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swaps/InputStreamSwap.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swaps/InputStreamSwap.java
@@ -119,7 +119,7 @@ public abstract class InputStreamSwap extends 
StringSwap<InputStream> {
         * @return The byte array.
         */
        protected InputStream toStream(byte[] b, ClassMeta<?> hint) {
-               var c = hint == null ? InputStream.class : hint.getInnerClass();
+               var c = hint == null ? InputStream.class : hint.inner();
                if (c == InputStream.class || c == ByteArrayInputStream.class)
                        return new ByteArrayInputStream(b);
                return null;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swaps/TemporalSwap.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swaps/TemporalSwap.java
index aa88b886f3..61ce3f65d5 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swaps/TemporalSwap.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swaps/TemporalSwap.java
@@ -385,7 +385,7 @@ public class TemporalSwap extends StringSwap<Temporal> {
                        return null;
                if (hint == null)
                        hint = session.getClassMeta(Instant.class);
-               var tc = (Class<? extends Temporal>)hint.getInnerClass();
+               var tc = (Class<? extends Temporal>)hint.inner();
 
                var offset = session.getTimeZoneId();
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserSession.java
index dbb9f62939..c93649832d 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserSession.java
@@ -365,7 +365,7 @@ public class UonParserSession extends ReaderParserSession 
implements HttpPartPar
                } else if (sType.isChar()) {
                        o = parseCharacter(parseString(r, isUrlParamValue));
                } else if (sType.isNumber()) {
-                       o = parseNumber(r, (Class<? extends 
Number>)sType.getInnerClass());
+                       o = parseNumber(r, (Class<? extends 
Number>)sType.inner());
                } else if (sType.isMap()) {
                        var m = (sType.canCreateNewInstance(outer) ? 
(Map)sType.newInstance(outer) : newGenericMap(sType));
                        o = parseIntoMap(r, m, sType.getKeyType(), 
sType.getValueType(), pMeta);
@@ -391,7 +391,7 @@ public class UonParserSession extends ReaderParserSession 
implements HttpPartPar
                        m = parseIntoBeanMap(r, m);
                        o = m == null ? null : builder.build(this, m.getBean(), 
eType);
                } else if (sType.canCreateNewBean(outer)) {
-                       var m = newBeanMap(outer, sType.getInnerClass());
+                       var m = newBeanMap(outer, sType.inner());
                        m = parseIntoBeanMap(r, m);
                        o = m == null ? null : m.getBean();
                } else if (sType.canCreateNewInstanceFromString(outer)) {
@@ -422,14 +422,14 @@ public class UonParserSession extends ReaderParserSession 
implements HttpPartPar
                        if (m.containsKey(getBeanTypePropertyName(sType)))
                                o = cast(m, pMeta, eType);
                        else if (nn(sType.getProxyInvocationHandler()))
-                               o = newBeanMap(outer, 
sType.getInnerClass()).load(m).getBean();
+                               o = newBeanMap(outer, 
sType.inner()).load(m).getBean();
                        else
-                               throw new ParseException(this, "Class ''{0}'' 
could not be instantiated.  Reason: ''{1}''", sType.getInnerClass().getName(), 
sType.getNotABeanReason());
+                               throw new ParseException(this, "Class ''{0}'' 
could not be instantiated.  Reason: ''{1}''", sType.inner().getName(), 
sType.getNotABeanReason());
                } else if (c == 'n') {
                        r.read(); // NOSONAR - Intentional.
                        parseNull(r);
                } else {
-                       throw new ParseException(this, "Class ''{0}'' could not 
be instantiated.  Reason: ''{1}''", sType.getInnerClass().getName(), 
sType.getNotABeanReason());
+                       throw new ParseException(this, "Class ''{0}'' could not 
be instantiated.  Reason: ''{1}''", sType.inner().getName(), 
sType.getNotABeanReason());
                }
 
                if (o == null && sType.isPrimitive())
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializerSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializerSession.java
index 2cd0d29181..f4c7bd71de 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializerSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializerSession.java
@@ -473,7 +473,7 @@ public class UonSerializerSession extends 
WriterSerializerSession implements Htt
                } else if (sType.isCollection()) {
                        serializeCollection(out, (Collection)o, eType);
                } else if (sType.isArray()) {
-                       serializeCollection(out, toList(sType.getInnerClass(), 
o), eType);
+                       serializeCollection(out, toList(sType.inner(), o), 
eType);
                } else if (sType.isReader()) {
                        pipe((Reader)o, out, SerializerSession::handleThrown);
                } else if (sType.isInputStream()) {
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserSession.java
index 6b4fad715a..d9ba3b908b 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserSession.java
@@ -253,7 +253,7 @@ public class UrlEncodingParserSession extends 
UonParserSession {
                        m = parseIntoBeanMap(r, m);
                        o = m == null ? null : builder.build(this, m.getBean(), 
eType);
                } else if (sType.canCreateNewBean(outer)) {
-                       var m = newBeanMap(outer, sType.getInnerClass());
+                       var m = newBeanMap(outer, sType.inner());
                        m = parseIntoBeanMap(r, m);
                        o = m == null ? null : m.getBean();
                } else if (sType.isCollection() || sType.isArray() || 
sType.isArgs()) {
@@ -265,7 +265,7 @@ public class UrlEncodingParserSession extends 
UonParserSession {
                        if (sType.isArgs())
                                o = c2.toArray(new Object[c2.size()]);
                        else if (sType.isArray())
-                               o = CollectionUtils.toArray(c2, 
sType.getElementType().getInnerClass());
+                               o = CollectionUtils.toArray(c2, 
sType.getElementType().inner());
                        else
                                o = c2;
                } else {
@@ -277,7 +277,7 @@ public class UrlEncodingParserSession extends 
UonParserSession {
                        else if (m.containsKey("_value"))
                                o = convertToType(m.get("_value"), sType);
                        else if (nn(sType.getProxyInvocationHandler())) {
-                               o = newBeanMap(outer, 
sType.getInnerClass()).load(m).getBean();
+                               o = newBeanMap(outer, 
sType.inner()).load(m).getBean();
                        } else {
                                if (nn(sType.getNotABeanReason()))
                                        throw new ParseException(this, "Class 
''{0}'' could not be instantiated as application/x-www-form-urlencoded.  
Reason: ''{1}''", sType, sType.getNotABeanReason());
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanMeta.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanMeta.java
index f9888dcee5..d654e42fbc 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanMeta.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanMeta.java
@@ -44,7 +44,7 @@ public class XmlBeanMeta extends ExtendedBeanMeta {
                XmlFormat contentFormat = DEFAULT;
 
                XmlBeanMetaBuilder(BeanMeta<?> beanMeta, XmlMetaProvider mp) {
-                       var c = beanMeta.getClassMeta().getInnerClass();
+                       var c = beanMeta.getClassMeta().inner();
                        var ci = beanMeta.getClassMeta();
                        var defaultFormat = Value.<XmlFormat>empty();
 
@@ -121,7 +121,7 @@ public class XmlBeanMeta extends ExtendedBeanMeta {
        public XmlBeanMeta(BeanMeta<?> beanMeta, XmlMetaProvider mp) {
                super(beanMeta);
 
-               var c = beanMeta.getClassMeta().getInnerClass();
+               var c = beanMeta.getClassMeta().inner();
                var b = new XmlBeanMetaBuilder(beanMeta, mp);
 
                attrs = u(b.attrs);
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanPropertyMeta.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanPropertyMeta.java
index af6c64ed07..528ad46887 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanPropertyMeta.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanPropertyMeta.java
@@ -118,7 +118,7 @@ public class XmlBeanPropertyMeta extends 
ExtendedBeanPropertyMeta {
 
                String cen = xml.childName();
                if ((! cen.isEmpty()) && (! isCollection))
-                       throw bex(cmProperty.getInnerClass(), "Annotation error 
on property ''{0}''.  @Xml.childName can only be specified on collections and 
arrays.", name);
+                       throw bex(cmProperty.inner(), "Annotation error on 
property ''{0}''.  @Xml.childName can only be specified on collections and 
arrays.", name);
 
                if (xmlFormat == XmlFormat.COLLAPSED) {
                        if (isCollection) {
@@ -129,7 +129,7 @@ public class XmlBeanPropertyMeta extends 
ExtendedBeanPropertyMeta {
                                if (cen == null || cen.isEmpty())
                                        cen = name;
                        } else {
-                               throw bex(cmBean.getInnerClass(), "Annotation 
error on property ''{0}''.  @Xml.format=COLLAPSED can only be specified on 
collections and arrays.", name);
+                               throw bex(cmBean.inner(), "Annotation error on 
property ''{0}''.  @Xml.format=COLLAPSED can only be specified on collections 
and arrays.", name);
                        }
                        if (cen.isEmpty() && isCollection)
                                cen = cmProperty.getDictionaryName();
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParserSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParserSession.java
index bdf44fa41b..13ededf3bc 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParserSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParserSession.java
@@ -848,11 +848,11 @@ public class XmlParserSession extends ReaderParserSession 
{
                        var l = (sType.canCreateNewInstance(outer) ? 
(Collection)sType.newInstance(outer) : new JsonList(this));
                        o = parseIntoCollection(r, l, sType, pMeta);
                } else if (sType.isNumber()) {
-                       o = parseNumber(getElementText(r), (Class<? extends 
Number>)sType.getInnerClass());
+                       o = parseNumber(getElementText(r), (Class<? extends 
Number>)sType.inner());
                } else if (nn(builder) || sType.canCreateNewBean(outer)) {
                        if (getXmlClassMeta(sType).getFormat() == COLLAPSED) {
                                var fieldName = r.getLocalName();
-                               var m = nn(builder) ? 
toBeanMap(builder.create(this, eType)) : newBeanMap(outer, 
sType.getInnerClass());
+                               var m = nn(builder) ? 
toBeanMap(builder.create(this, eType)) : newBeanMap(outer, sType.inner());
                                var bpm = 
getXmlBeanMeta(m.getMeta()).getPropertyMeta(fieldName);
                                var cm = m.getMeta().getClassMeta();
                                Object value = parseAnything(cm, currAttr, r, 
m.getBean(false), false, null);
@@ -860,7 +860,7 @@ public class XmlParserSession extends ReaderParserSession {
                                bpm.set(m, currAttr, value);
                                o = nn(builder) ? builder.build(this, 
m.getBean(), eType) : m.getBean();
                        } else {
-                               var m = nn(builder) ? 
toBeanMap(builder.create(this, eType)) : newBeanMap(outer, 
sType.getInnerClass());
+                               var m = nn(builder) ? 
toBeanMap(builder.create(this, eType)) : newBeanMap(outer, sType.inner());
                                m = parseIntoBean(r, m, isNil);
                                o = nn(builder) ? builder.build(this, 
m.getBean(), eType) : m.getBean();
                        }
@@ -874,9 +874,9 @@ public class XmlParserSession extends ReaderParserSession {
                        parseIntoMap(r, m, string(), object(), pMeta);
                        if (nn(wrapperAttr))
                                m = new JsonMap(this).append(wrapperAttr, m);
-                       o = newBeanMap(outer, 
sType.getInnerClass()).load(m).getBean();
+                       o = newBeanMap(outer, sType.inner()).load(m).getBean();
                } else {
-                       throw new ParseException(this, "Class ''{0}'' could not 
be instantiated.  Reason: ''{1}'', property: ''{2}''", 
sType.getInnerClass().getName(), sType.getNotABeanReason(),
+                       throw new ParseException(this, "Class ''{0}'' could not 
be instantiated.  Reason: ''{1}'', property: ''{2}''", sType.inner().getName(), 
sType.getNotABeanReason(),
                                pMeta == null ? null : pMeta.getName());
                }
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
index 6349ed7ef9..d5d51f36ae 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
@@ -506,7 +506,7 @@ public class XmlSerializerSession extends 
WriterSerializerSession {
 
                var eeType = eType.getElementType();
 
-               var c = (sType.isCollection() ? (Collection)in : 
toList(sType.getInnerClass(), in));
+               var c = (sType.isCollection() ? (Collection)in : 
toList(sType.inner(), in));
 
                var type2 = (String)null;
 
diff --git 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestResponse.java
 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestResponse.java
index 856fccaa47..b91cbe7634 100644
--- 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestResponse.java
+++ 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestResponse.java
@@ -907,7 +907,7 @@ public class RestResponse implements HttpResponse, 
AutoCloseable {
 
        @SuppressWarnings("unchecked")
        <T> T as(ResponseBeanMeta rbm) {
-               var c = (Class<T>)rbm.getClassMeta().getInnerClass();
+               var c = (Class<T>)rbm.getClassMeta().inner();
                final RestClient rc = this.client;
                return (T)Proxy.newProxyInstance(c.getClassLoader(), a(c), 
(InvocationHandler)(proxy, method, args) -> {
                        var pm = rbm.getProperty(method.getName());
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
index af368e0b3e..c81104fc11 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
@@ -1158,7 +1158,7 @@ public class RestRequest extends 
HttpServletRequestWrapper {
         */
        public <T> T getRequest(RequestBeanMeta rbm) {
                try {
-                       var c = (Class<T>)rbm.getClassMeta().getInnerClass();
+                       var c = (Class<T>)rbm.getClassMeta().inner();
                        final BeanSession bs = getBeanSession();
                        final BeanMeta<T> bm = bs.getBeanMeta(c);
                        return (T)Proxy.newProxyInstance(c.getClassLoader(), 
a(c), (InvocationHandler)(proxy, method, args) -> {
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/FormDataArg.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/FormDataArg.java
index 9419fa9fb0..282e37babc 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/FormDataArg.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/FormDataArg.java
@@ -193,7 +193,7 @@ public class FormDataArg implements RestOpArg {
                if (multi) {
                        Collection c = cm.isArray() ? list() : 
(Collection)(cm.canCreateNewInstance() ? cm.newInstance() : new JsonList());
                        rh.getAll(name).stream().map(x -> 
x.parser(ps).schema(schema).as(cm.getElementType()).orElse(null)).forEach(x -> 
c.add(x));
-                       return cm.isArray() ? toArray(c, 
cm.getElementType().getInnerClass()) : c;
+                       return cm.isArray() ? toArray(c, 
cm.getElementType().inner()) : c;
                }
 
                if (cm.isMapOrBean() && isOneOf(name, "*", "")) {
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/HeaderArg.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/HeaderArg.java
index 115daac333..fdd6fbbbb4 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/HeaderArg.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/HeaderArg.java
@@ -239,7 +239,7 @@ public class HeaderArg implements RestOpArg {
                if (multi) {
                        var c = cm.isArray() ? list() : 
(Collection)(cm.canCreateNewInstance() ? cm.newInstance() : new JsonList());
                        rh.stream(name).map(x -> 
x.parser(ps).schema(schema).as(cm.getElementType()).orElse(null)).forEach(x -> 
c.add(x));
-                       return cm.isArray() ? toArray(c, 
cm.getElementType().getInnerClass()) : c;
+                       return cm.isArray() ? toArray(c, 
cm.getElementType().inner()) : c;
                }
 
                if (cm.isMapOrBean() && isOneOf(name, "*", "")) {
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/QueryArg.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/QueryArg.java
index 412b92179a..1f692d3608 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/QueryArg.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/QueryArg.java
@@ -194,7 +194,7 @@ public class QueryArg implements RestOpArg {
                if (multi) {
                        var c = cm.isArray() ? list() : 
(Collection)(cm.canCreateNewInstance() ? cm.newInstance() : new JsonList());
                        rh.getAll(name).stream().map(x -> 
x.parser(ps).schema(schema).as(cm.getElementType()).orElse(null)).forEach(x -> 
c.add(x));
-                       return cm.isArray() ? toArray(c, 
cm.getElementType().getInnerClass()) : c;
+                       return cm.isArray() ? toArray(c, 
cm.getElementType().inner()) : c;
                }
 
                if (cm.isMapOrBean() && isOneOf(name, "*", "")) {
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/rrpc/RrpcRestOpContext.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/rrpc/RrpcRestOpContext.java
index b45be5f847..ba1c66abd2 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/rrpc/RrpcRestOpContext.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/rrpc/RrpcRestOpContext.java
@@ -47,7 +47,7 @@ public class RrpcRestOpContext extends RestOpContext {
                super(builder);
 
                var interfaceClass = 
getBeanContext().getClassMeta(getJavaMethod().getGenericReturnType());
-               meta = new RrpcInterfaceMeta(interfaceClass.getInnerClass(), 
null);
+               meta = new RrpcInterfaceMeta(interfaceClass.inner(), null);
                if (meta.getMethodsByPath().isEmpty())
                        throw new InternalServerError("Method {0} returns an 
interface {1} that doesn't define any remote methods.", 
getJavaMethod().getName(), interfaceClass.getNameFull());
 
diff --git a/juneau-utest/src/test/java/org/apache/juneau/BeanMap_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/BeanMap_Test.java
index 7d207185de..a281f19f00 100755
--- a/juneau-utest/src/test/java/org/apache/juneau/BeanMap_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/BeanMap_Test.java
@@ -662,15 +662,15 @@ class BeanMap_Test extends TestBase {
        
//====================================================================================================
        @Test void a11_automaticDetectionOfGenericTypes() {
                var bm = BeanContext.DEFAULT.newBeanMap(I.class);
-               assertEquals(String.class, 
bm.getProperty("p1").getMeta().getClassMeta().getElementType().getInnerClass());
-               assertEquals(Integer.class, 
bm.getProperty("p2").getMeta().getClassMeta().getElementType().getInnerClass());
-               assertEquals(Object.class, 
bm.getProperty("p3").getMeta().getClassMeta().getElementType().getInnerClass());
-               assertEquals(String.class, 
bm.getProperty("p4").getMeta().getClassMeta().getKeyType().getInnerClass());
-               assertEquals(Integer.class, 
bm.getProperty("p4").getMeta().getClassMeta().getValueType().getInnerClass());
-               assertEquals(String.class, 
bm.getProperty("p5").getMeta().getClassMeta().getKeyType().getInnerClass());
-               assertEquals(Integer.class, 
bm.getProperty("p5").getMeta().getClassMeta().getValueType().getInnerClass());
-               assertEquals(Object.class, 
bm.getProperty("p6").getMeta().getClassMeta().getKeyType().getInnerClass());
-               assertEquals(Object.class, 
bm.getProperty("p6").getMeta().getClassMeta().getValueType().getInnerClass());
+               assertEquals(String.class, 
bm.getProperty("p1").getMeta().getClassMeta().getElementType().inner());
+               assertEquals(Integer.class, 
bm.getProperty("p2").getMeta().getClassMeta().getElementType().inner());
+               assertEquals(Object.class, 
bm.getProperty("p3").getMeta().getClassMeta().getElementType().inner());
+               assertEquals(String.class, 
bm.getProperty("p4").getMeta().getClassMeta().getKeyType().inner());
+               assertEquals(Integer.class, 
bm.getProperty("p4").getMeta().getClassMeta().getValueType().inner());
+               assertEquals(String.class, 
bm.getProperty("p5").getMeta().getClassMeta().getKeyType().inner());
+               assertEquals(Integer.class, 
bm.getProperty("p5").getMeta().getClassMeta().getValueType().inner());
+               assertEquals(Object.class, 
bm.getProperty("p6").getMeta().getClassMeta().getKeyType().inner());
+               assertEquals(Object.class, 
bm.getProperty("p6").getMeta().getClassMeta().getValueType().inner());
        }
 
        public static class I {
@@ -687,15 +687,15 @@ class BeanMap_Test extends TestBase {
        
//====================================================================================================
        @Test void a12_overridingDetectionOfGenericTypes() {
                var bm = BeanContext.DEFAULT.newBeanMap(J.class);
-               assertEquals(Float.class, 
bm.getProperty("p1").getMeta().getClassMeta().getElementType().getInnerClass());
-               assertEquals(Float.class, 
bm.getProperty("p2").getMeta().getClassMeta().getElementType().getInnerClass());
-               assertEquals(Float.class, 
bm.getProperty("p3").getMeta().getClassMeta().getElementType().getInnerClass());
-               assertEquals(Object.class, 
bm.getProperty("p4").getMeta().getClassMeta().getKeyType().getInnerClass());
-               assertEquals(Float.class, 
bm.getProperty("p4").getMeta().getClassMeta().getValueType().getInnerClass());
-               assertEquals(Object.class, 
bm.getProperty("p5").getMeta().getClassMeta().getKeyType().getInnerClass());
-               assertEquals(Float.class, 
bm.getProperty("p5").getMeta().getClassMeta().getValueType().getInnerClass());
-               assertEquals(String.class, 
bm.getProperty("p6").getMeta().getClassMeta().getKeyType().getInnerClass());
-               assertEquals(Float.class, 
bm.getProperty("p6").getMeta().getClassMeta().getValueType().getInnerClass());
+               assertEquals(Float.class, 
bm.getProperty("p1").getMeta().getClassMeta().getElementType().inner());
+               assertEquals(Float.class, 
bm.getProperty("p2").getMeta().getClassMeta().getElementType().inner());
+               assertEquals(Float.class, 
bm.getProperty("p3").getMeta().getClassMeta().getElementType().inner());
+               assertEquals(Object.class, 
bm.getProperty("p4").getMeta().getClassMeta().getKeyType().inner());
+               assertEquals(Float.class, 
bm.getProperty("p4").getMeta().getClassMeta().getValueType().inner());
+               assertEquals(Object.class, 
bm.getProperty("p5").getMeta().getClassMeta().getKeyType().inner());
+               assertEquals(Float.class, 
bm.getProperty("p5").getMeta().getClassMeta().getValueType().inner());
+               assertEquals(String.class, 
bm.getProperty("p6").getMeta().getClassMeta().getKeyType().inner());
+               assertEquals(Float.class, 
bm.getProperty("p6").getMeta().getClassMeta().getValueType().inner());
        }
 
        public static class J {
@@ -712,15 +712,15 @@ class BeanMap_Test extends TestBase {
        
//====================================================================================================
        @Test void a13_overridingDetectionOfGenericTypes2() {
                var bm = bc.newBeanMap(K.class);
-               assertEquals(Float.class, 
bm.getProperty("p1").getMeta().getClassMeta().getElementType().getInnerClass());
-               assertEquals(Float.class, 
bm.getProperty("p2").getMeta().getClassMeta().getElementType().getInnerClass());
-               assertEquals(Float.class, 
bm.getProperty("p3").getMeta().getClassMeta().getElementType().getInnerClass());
-               assertEquals(String.class, 
bm.getProperty("p4").getMeta().getClassMeta().getKeyType().getInnerClass());
-               assertEquals(Float.class, 
bm.getProperty("p4").getMeta().getClassMeta().getValueType().getInnerClass());
-               assertEquals(String.class, 
bm.getProperty("p5").getMeta().getClassMeta().getKeyType().getInnerClass());
-               assertEquals(Float.class, 
bm.getProperty("p5").getMeta().getClassMeta().getValueType().getInnerClass());
-               assertEquals(String.class, 
bm.getProperty("p6").getMeta().getClassMeta().getKeyType().getInnerClass());
-               assertEquals(Float.class, 
bm.getProperty("p6").getMeta().getClassMeta().getValueType().getInnerClass());
+               assertEquals(Float.class, 
bm.getProperty("p1").getMeta().getClassMeta().getElementType().inner());
+               assertEquals(Float.class, 
bm.getProperty("p2").getMeta().getClassMeta().getElementType().inner());
+               assertEquals(Float.class, 
bm.getProperty("p3").getMeta().getClassMeta().getElementType().inner());
+               assertEquals(String.class, 
bm.getProperty("p4").getMeta().getClassMeta().getKeyType().inner());
+               assertEquals(Float.class, 
bm.getProperty("p4").getMeta().getClassMeta().getValueType().inner());
+               assertEquals(String.class, 
bm.getProperty("p5").getMeta().getClassMeta().getKeyType().inner());
+               assertEquals(Float.class, 
bm.getProperty("p5").getMeta().getClassMeta().getValueType().inner());
+               assertEquals(String.class, 
bm.getProperty("p6").getMeta().getClassMeta().getKeyType().inner());
+               assertEquals(Float.class, 
bm.getProperty("p6").getMeta().getClassMeta().getValueType().inner());
        }
 
        public static class K {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/ClassMeta_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/ClassMeta_Test.java
index aec4b4f7ac..71d7f5ae3d 100755
--- a/juneau-utest/src/test/java/org/apache/juneau/ClassMeta_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/ClassMeta_Test.java
@@ -43,18 +43,18 @@ class ClassMeta_Test extends TestBase {
                assertTrue(t.isMap());
                assertFalse(t.isCollection());
                assertNull(t.newInstance());
-               assertEquals(Map.class, t.getInnerClass());
-               assertEquals(String.class, t.getKeyType().getInnerClass());
-               assertEquals(String.class, t.getValueType().getInnerClass());
+               assertEquals(Map.class, t.inner());
+               assertEquals(String.class, t.getKeyType().inner());
+               assertEquals(String.class, t.getValueType().inner());
        }
 
        public String fb;
 
        @Test void a02_string() throws Exception {
                var t = 
bc.getClassMeta(this.getClass().getField("fb").getGenericType());
-               assertEquals(String.class, t.getInnerClass());
+               assertEquals(String.class, t.inner());
                var t2 = 
bc.getClassMeta(this.getClass().getField("fb").getType());
-               assertEquals(String.class, t2.getInnerClass());
+               assertEquals(String.class, t2.inner());
        }
 
        public Map<String,Map<String,Integer>> fc;
@@ -126,11 +126,11 @@ class ClassMeta_Test extends TestBase {
                assertNull(hc1.getSwap(bs));
                assertNull(hi2.getSwap(bs));
                assertNull(hc2.getSwap(bs));
-               assertEquals(ooo.getSerializedClassMeta(bs).getInnerClass(), 
Object.class);
-               assertEquals(hi1.getSerializedClassMeta(bs).getInnerClass(), 
BI1.class);
-               assertEquals(hc1.getSerializedClassMeta(bs).getInnerClass(), 
BC1.class);
-               assertEquals(hi2.getSerializedClassMeta(bs).getInnerClass(), 
BI2.class);
-               assertEquals(hc2.getSerializedClassMeta(bs).getInnerClass(), 
BC2.class);
+               assertEquals(ooo.getSerializedClassMeta(bs).inner(), 
Object.class);
+               assertEquals(hi1.getSerializedClassMeta(bs).inner(), BI1.class);
+               assertEquals(hc1.getSerializedClassMeta(bs).inner(), BC1.class);
+               assertEquals(hi2.getSerializedClassMeta(bs).inner(), BI2.class);
+               assertEquals(hc2.getSerializedClassMeta(bs).inner(), BC2.class);
 
                bc2 = BeanContext.create().swaps(BI1Swap.class).build();
                bs = bc2.getSession();
@@ -149,11 +149,11 @@ class ClassMeta_Test extends TestBase {
                assertEquals(hc1.getSwap(bs).getClass(), BI1Swap.class);
                assertEquals(hi2.getSwap(bs).getClass(), BI1Swap.class);
                assertEquals(hc2.getSwap(bs).getClass(), BI1Swap.class);
-               assertEquals(ooo.getSerializedClassMeta(bs).getInnerClass(), 
Object.class);
-               assertEquals(hi1.getSerializedClassMeta(bs).getInnerClass(), 
Map.class);
-               assertEquals(hc1.getSerializedClassMeta(bs).getInnerClass(), 
Map.class);
-               assertEquals(hi2.getSerializedClassMeta(bs).getInnerClass(), 
Map.class);
-               assertEquals(hc2.getSerializedClassMeta(bs).getInnerClass(), 
Map.class);
+               assertEquals(ooo.getSerializedClassMeta(bs).inner(), 
Object.class);
+               assertEquals(hi1.getSerializedClassMeta(bs).inner(), Map.class);
+               assertEquals(hc1.getSerializedClassMeta(bs).inner(), Map.class);
+               assertEquals(hi2.getSerializedClassMeta(bs).inner(), Map.class);
+               assertEquals(hc2.getSerializedClassMeta(bs).inner(), Map.class);
 
                bc2 = BeanContext.create().swaps(BC1Swap.class).build();
                bs = bc2.getSession();
@@ -172,11 +172,11 @@ class ClassMeta_Test extends TestBase {
                assertEquals(hc1.getSwap(bs).getClass(), BC1Swap.class);
                assertNull(hi2.getSwap(bs));
                assertEquals(hc2.getSwap(bs).getClass(), BC1Swap.class);
-               assertEquals(ooo.getSerializedClassMeta(bs).getInnerClass(), 
Object.class);
-               assertEquals(hi1.getSerializedClassMeta(bs).getInnerClass(), 
BI1.class);
-               assertEquals(hc1.getSerializedClassMeta(bs).getInnerClass(), 
Map.class);
-               assertEquals(hi2.getSerializedClassMeta(bs).getInnerClass(), 
BI2.class);
-               assertEquals(hc2.getSerializedClassMeta(bs).getInnerClass(), 
Map.class);
+               assertEquals(ooo.getSerializedClassMeta(bs).inner(), 
Object.class);
+               assertEquals(hi1.getSerializedClassMeta(bs).inner(), BI1.class);
+               assertEquals(hc1.getSerializedClassMeta(bs).inner(), Map.class);
+               assertEquals(hi2.getSerializedClassMeta(bs).inner(), BI2.class);
+               assertEquals(hc2.getSerializedClassMeta(bs).inner(), Map.class);
 
                bc2 = BeanContext.create().swaps(BI2Swap.class).build();
                bs = bc2.getSession();
@@ -195,11 +195,11 @@ class ClassMeta_Test extends TestBase {
                assertNull(hc1.getSwap(bs));
                assertEquals(hi2.getSwap(bs).getClass(), BI2Swap.class);
                assertEquals(hc2.getSwap(bs).getClass(), BI2Swap.class);
-               assertEquals(ooo.getSerializedClassMeta(bs).getInnerClass(), 
Object.class);
-               assertEquals(hi1.getSerializedClassMeta(bs).getInnerClass(), 
BI1.class);
-               assertEquals(hc1.getSerializedClassMeta(bs).getInnerClass(), 
BC1.class);
-               assertEquals(hi2.getSerializedClassMeta(bs).getInnerClass(), 
Map.class);
-               assertEquals(hc2.getSerializedClassMeta(bs).getInnerClass(), 
Map.class);
+               assertEquals(ooo.getSerializedClassMeta(bs).inner(), 
Object.class);
+               assertEquals(hi1.getSerializedClassMeta(bs).inner(), BI1.class);
+               assertEquals(hc1.getSerializedClassMeta(bs).inner(), BC1.class);
+               assertEquals(hi2.getSerializedClassMeta(bs).inner(), Map.class);
+               assertEquals(hc2.getSerializedClassMeta(bs).inner(), Map.class);
 
                bc2 = BeanContext.create().swaps(BC2Swap.class).build();
                bs = bc2.getSession();
@@ -218,11 +218,11 @@ class ClassMeta_Test extends TestBase {
                assertNull(hc1.getSwap(bs));
                assertNull(hi2.getSwap(bs));
                assertEquals(hc2.getSwap(bs).getClass(), BC2Swap.class);
-               assertEquals(ooo.getSerializedClassMeta(bs).getInnerClass(), 
Object.class);
-               assertEquals(hi1.getSerializedClassMeta(bs).getInnerClass(), 
BI1.class);
-               assertEquals(hc1.getSerializedClassMeta(bs).getInnerClass(), 
BC1.class);
-               assertEquals(hi2.getSerializedClassMeta(bs).getInnerClass(), 
BI2.class);
-               assertEquals(hc2.getSerializedClassMeta(bs).getInnerClass(), 
Map.class);
+               assertEquals(ooo.getSerializedClassMeta(bs).inner(), 
Object.class);
+               assertEquals(hi1.getSerializedClassMeta(bs).inner(), BI1.class);
+               assertEquals(hc1.getSerializedClassMeta(bs).inner(), BC1.class);
+               assertEquals(hi2.getSerializedClassMeta(bs).inner(), BI2.class);
+               assertEquals(hc2.getSerializedClassMeta(bs).inner(), Map.class);
 
                bc2 = 
BeanContext.create().swaps(BI1Swap.class,BC1Swap.class,BI2Swap.class, 
BC2Swap.class).build();
                bs = bc2.getSession();
@@ -241,11 +241,11 @@ class ClassMeta_Test extends TestBase {
                assertEquals(hc1.getSwap(bs).getClass(), BI1Swap.class);
                assertEquals(hi2.getSwap(bs).getClass(), BI1Swap.class);
                assertEquals(hc2.getSwap(bs).getClass(), BI1Swap.class);
-               assertEquals(ooo.getSerializedClassMeta(bs).getInnerClass(), 
Object.class);
-               assertEquals(hi1.getSerializedClassMeta(bs).getInnerClass(), 
Map.class);
-               assertEquals(hc1.getSerializedClassMeta(bs).getInnerClass(), 
Map.class);
-               assertEquals(hi2.getSerializedClassMeta(bs).getInnerClass(), 
Map.class);
-               assertEquals(hc2.getSerializedClassMeta(bs).getInnerClass(), 
Map.class);
+               assertEquals(ooo.getSerializedClassMeta(bs).inner(), 
Object.class);
+               assertEquals(hi1.getSerializedClassMeta(bs).inner(), Map.class);
+               assertEquals(hc1.getSerializedClassMeta(bs).inner(), Map.class);
+               assertEquals(hi2.getSerializedClassMeta(bs).inner(), Map.class);
+               assertEquals(hc2.getSerializedClassMeta(bs).inner(), Map.class);
 
                bc2 = 
BeanContext.create().swaps(BC2Swap.class,BI2Swap.class,BC1Swap.class, 
BI1Swap.class).build();
                bs = bc2.getSession();
@@ -264,11 +264,11 @@ class ClassMeta_Test extends TestBase {
                assertEquals(hc1.getSwap(bs).getClass(), BC1Swap.class);
                assertEquals(hi2.getSwap(bs).getClass(), BI2Swap.class);
                assertEquals(hc2.getSwap(bs).getClass(), BC2Swap.class);
-               assertEquals(ooo.getSerializedClassMeta(bs).getInnerClass(), 
Object.class);
-               assertEquals(hi1.getSerializedClassMeta(bs).getInnerClass(), 
Map.class);
-               assertEquals(hc1.getSerializedClassMeta(bs).getInnerClass(), 
Map.class);
-               assertEquals(hi2.getSerializedClassMeta(bs).getInnerClass(), 
Map.class);
-               assertEquals(hc2.getSerializedClassMeta(bs).getInnerClass(), 
Map.class);
+               assertEquals(ooo.getSerializedClassMeta(bs).inner(), 
Object.class);
+               assertEquals(hi1.getSerializedClassMeta(bs).inner(), Map.class);
+               assertEquals(hc1.getSerializedClassMeta(bs).inner(), Map.class);
+               assertEquals(hi2.getSerializedClassMeta(bs).inner(), Map.class);
+               assertEquals(hc2.getSerializedClassMeta(bs).inner(), Map.class);
        }
 
        
//-----------------------------------------------------------------------------------------------------------------
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/objecttools/ObjectRest_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/objecttools/ObjectRest_Test.java
index 079c5ef77f..215619021c 100755
--- 
a/juneau-utest/src/test/java/org/apache/juneau/objecttools/ObjectRest_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/objecttools/ObjectRest_Test.java
@@ -755,8 +755,8 @@ class ObjectRest_Test extends TestBase {
        
//====================================================================================================
        @Test void f04_getClassMeta() {
                var model = ObjectRest.create(new AddressBook().init());
-               assertEquals("Person", 
model.getClassMeta("0").getInnerClass().getSimpleName());
-               assertEquals("String", 
model.getClassMeta("0/addresses/0/state").getInnerClass().getSimpleName());
+               assertEquals("Person", 
model.getClassMeta("0").inner().getSimpleName());
+               assertEquals("String", 
model.getClassMeta("0/addresses/0/state").inner().getSimpleName());
                assertNull(model.getClassMeta("1"));
                assertNull(model.getClassMeta("0/addresses/1/state"));
        }

Reply via email to