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 e3ae95c  Collections usage optimizations
e3ae95c is described below

commit e3ae95cab45f35bc4de4f219e23ae5dc20e02317
Author: JamesBognar <[email protected]>
AuthorDate: Sun Mar 13 15:57:18 2022 -0400

    Collections usage optimizations
---
 .../java/org/apache/juneau/internal/HttpUtils.java |  19 ++--
 .../java/org/apache/juneau/internal/MultiSet.java  |  29 ++----
 .../org/apache/juneau/internal/ObjectUtils.java    |   2 +-
 .../juneau/jsonschema/JsonSchemaGenerator.java     |   8 +-
 .../jsonschema/JsonSchemaGeneratorSession.java     |   2 +-
 .../main/java/org/apache/juneau/parser/Parser.java |   5 +-
 .../java/org/apache/juneau/parser/ParserSet.java   |  20 ++--
 .../org/apache/juneau/reflect/AnnotationInfo.java  |  28 ++++--
 .../org/apache/juneau/reflect/AnnotationList.java  |   2 +-
 .../java/org/apache/juneau/reflect/ClassInfo.java  | 102 ++++++++++++---------
 .../org/apache/juneau/reflect/ExecutableInfo.java  |  36 ++++----
 .../java/org/apache/juneau/reflect/MethodInfo.java |  30 +++---
 .../java/org/apache/juneau/reflect/ParamInfo.java  |  12 +--
 .../org/apache/juneau/reflect/ClassInfoTest.java   |  22 ++---
 .../apache/juneau/reflect/ExecutableInfoTest.java  |   4 +-
 .../java/org/apache/juneau/utils/MultiSetTest.java |   2 +-
 16 files changed, 174 insertions(+), 149 deletions(-)

diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/HttpUtils.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/HttpUtils.java
index 4c48452..22359ef 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/HttpUtils.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/HttpUtils.java
@@ -12,7 +12,6 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.internal;
 
-import static org.apache.juneau.internal.StringUtils.*;
 import java.lang.reflect.*;
 
 /**
@@ -24,6 +23,10 @@ import java.lang.reflect.*;
  */
 public class HttpUtils {
 
+       private static final String[]
+               LC_METHODS = new 
String[]{"get","put","post","delete","options","head","connect","trace","patch"},
+               UC_METHODS = new 
String[]{"GET","PUT","POST","DELETE","OPTIONS","HEAD","CONNECT","TRACE","PATCH"};
+
        /**
         * Given a method name, infers the REST method name.
         *
@@ -37,10 +40,11 @@ public class HttpUtils {
                if (detectMethod) {
                        if (n.startsWith("do") && n.length() > 2) {
                                String n2 = n.substring(2).toUpperCase();
-                               if (isOneOf(n2, 
"GET","PUT","POST","DELETE","OPTIONS","HEAD","CONNECT","TRACE","PATCH"))
-                                       return n2;
+                               for (String t : UC_METHODS)
+                                       if (n2.equals(t))
+                                               return n2;
                        }
-                       for (String t : new 
String[]{"get","put","post","delete","options","head","connect","trace","patch"})
+                       for (String t : LC_METHODS)
                                if (n.startsWith(t) && (n.length() == 
t.length() || Character.isUpperCase(n.charAt(t.length()))))
                                        return t.toUpperCase();
                }
@@ -59,10 +63,11 @@ public class HttpUtils {
                if (method == null) {
                        if (n.startsWith("do") && n.length() > 2) {
                                String n2 = n.substring(2).toUpperCase();
-                               if (isOneOf(n2, 
"GET","PUT","POST","DELETE","OPTIONS","HEAD","CONNECT","TRACE","PATCH"))
-                                       return "/";
+                               for (String t : UC_METHODS)
+                                       if (n2.equals(t))
+                                               return "/";
                        }
-                       for (String t : new 
String[]{"get","put","post","delete","options","head","connect","trace","patch"})
 {
+                       for (String t : LC_METHODS) {
                                if (n.startsWith(t) && (n.length() == 
t.length() || Character.isUpperCase(n.charAt(t.length())))) {
                                        return '/' + 
java.beans.Introspector.decapitalize(n.substring(t.length()));
                                }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/MultiSet.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/MultiSet.java
index 6e72561..0a57eb0 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/MultiSet.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/MultiSet.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.internal;
 
 import static org.apache.juneau.assertions.Assertions.*;
+
 import java.util.*;
 
 /**
@@ -27,7 +28,7 @@ import java.util.*;
 public class MultiSet<E> extends AbstractSet<E> {
 
        /** Inner collections. */
-       final List<Collection<E>> l = new ArrayList<>();
+       final Collection<E>[] l;
 
        /**
         * Create a new Set that consists as a coalesced set of the specified 
collections.
@@ -36,20 +37,10 @@ public class MultiSet<E> extends AbstractSet<E> {
         */
        @SafeVarargs
        public MultiSet(Collection<E>...c) {
-               for (Collection<E> cc : c)
-                       append(cc);
-       }
-
-       /**
-        * Appends the specified collection to this set of collections.
-        *
-        * @param c The collection to append to this set of collections.
-        * @return This object.
-        */
-       public MultiSet<E> append(Collection<E> c) {
                assertArgNotNull("c", c);
-               l.add(c);
-               return this;
+               for (Collection<E> cc : c)
+                       assertArgNotNull("c", cc);
+               l = c;
        }
 
        /**
@@ -59,7 +50,7 @@ public class MultiSet<E> extends AbstractSet<E> {
        public Iterator<E> iterator() {
                return new Iterator<E>() {
                        int i = 0;
-                       Iterator<E> i2 = (l.size() > 0 ? l.get(i++).iterator() 
: null);
+                       Iterator<E> i2 = (l.length > 0 ? l[i++].iterator() : 
null);
 
                        @Override /* Iterator */
                        public boolean hasNext() {
@@ -67,8 +58,8 @@ public class MultiSet<E> extends AbstractSet<E> {
                                        return false;
                                if (i2.hasNext())
                                        return true;
-                               for (int j = i; j < l.size(); j++)
-                                       if (l.get(j).size() > 0)
+                               for (int j = i; j < l.length; j++)
+                                       if (l[j].size() > 0)
                                                return true;
                                return false;
                        }
@@ -78,9 +69,9 @@ public class MultiSet<E> extends AbstractSet<E> {
                                if (i2 == null)
                                        throw new NoSuchElementException();
                                while (! i2.hasNext()) {
-                                       if (i >= l.size())
+                                       if (i >= l.length)
                                                throw new 
NoSuchElementException();
-                                       i2 = l.get(i++).iterator();
+                                       i2 = l[i++].iterator();
                                }
                                return i2.next();
                        }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ObjectUtils.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ObjectUtils.java
index 1014036..966f8ab 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ObjectUtils.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ObjectUtils.java
@@ -285,7 +285,7 @@ public class ObjectUtils {
                                MethodInfo mi = ci.getDeclaredMethod(x -> 
x.hasName("properties"));
                                if (mi != null)
                                        methods2.put(cname, mi.accessible());
-                               ci = ci.getParent();
+                               ci = ci.getSuperclass();
                        } while (ci != null);
                        methods = methods2;
                        PROPERTIES_METHODS.put(o.getClass(), methods);
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 6d36ad6..e40f77b 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
@@ -854,7 +854,7 @@ public class JsonSchemaGenerator extends 
BeanTraverseContext implements JsonSche
        private final BeanDefMapper beanDefMapperBean;
        final JsonSerializer jsonSerializer;
        final JsonParser jsonParser;
-       private final Set<Pattern> ignoreTypePatterns;
+       private final Pattern[] ignoreTypePatterns;
        private final Map<ClassMeta<?>,JsonSchemaClassMeta> 
jsonSchemaClassMetas = new ConcurrentHashMap<>();
        private final Map<BeanPropertyMeta,JsonSchemaBeanPropertyMeta> 
jsonSchemaBeanPropertyMetas = new ConcurrentHashMap<>();
 
@@ -876,7 +876,7 @@ public class JsonSchemaGenerator extends 
BeanTraverseContext implements JsonSche
 
                Set<Pattern> ignoreTypePatterns = set();
                ignoreTypes.forEach(y -> split(y, x -> 
ignoreTypePatterns.add(Pattern.compile(x.replace(".", "\\.").replace("*", 
".*")))));
-               this.ignoreTypePatterns = ignoreTypePatterns;
+               this.ignoreTypePatterns = ignoreTypePatterns.toArray(new 
Pattern[ignoreTypePatterns.size()]);
 
                try {
                        beanDefMapperBean = beanDefMapper.newInstance();
@@ -977,8 +977,8 @@ public class JsonSchemaGenerator extends 
BeanTraverseContext implements JsonSche
         * @return
         *      Custom schema information for particular class types.
         */
-       public Set<Pattern> getIgnoreTypes() {
-               return ignoreTypePatterns;
+       public List<Pattern> getIgnoreTypes() {
+               return ulist(ignoreTypePatterns);
        }
 
        /**
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 af3e205..0f81c55 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
@@ -539,7 +539,7 @@ public class JsonSchemaGeneratorSession extends 
BeanTraverseSession {
         * @return
         *      Custom schema information for particular class types.
         */
-       protected final Set<Pattern> getIgnoreTypes() {
+       protected final List<Pattern> getIgnoreTypes() {
                return ctx.getIgnoreTypes();
        }
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/Parser.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/Parser.java
index dc5d96d..0138360 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/Parser.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/Parser.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.parser;
 
 import static org.apache.juneau.collections.JsonMap.*;
+import static org.apache.juneau.internal.CollectionUtils.*;
 import static org.apache.juneau.internal.StringUtils.*;
 
 import java.io.*;
@@ -1362,8 +1363,8 @@ public class Parser extends BeanContextable {
         *
         * @return The list of media types.  Never <jk>null</jk>.
         */
-       public final MediaType[] getMediaTypes() {
-               return consumesArray;
+       public final List<MediaType> getMediaTypes() {
+               return ulist(consumesArray);
        }
 
        /**
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 20d3125..3fddf50 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
@@ -483,8 +483,8 @@ public final class ParserSet {
        // Maps Content-Type headers to matches.
        private final ConcurrentHashMap<String,ParserMatch> cache = new 
ConcurrentHashMap<>();
 
-       private final List<MediaType> mediaTypes;
-       private final List<Parser> mediaTypeParsers;
+       private final MediaType[] mediaTypes;
+       private final Parser[] mediaTypeParsers;
 
        final Parser[] entries;
 
@@ -500,14 +500,14 @@ public final class ParserSet {
                List<MediaType> lmt = list();
                List<Parser> l = list();
                for (Parser e : entries) {
-                       for (MediaType m: e.getMediaTypes()) {
-                               lmt.add(m);
+                       e.getMediaTypes().forEach(x -> {
+                               lmt.add(x);
                                l.add(e);
-                       }
+                       });
                }
 
-               this.mediaTypes = unmodifiable(lmt);
-               this.mediaTypeParsers = unmodifiable(l);
+               this.mediaTypes = array(lmt, MediaType.class);
+               this.mediaTypeParsers = array(l, Parser.class);
        }
 
        private Parser build(Object o) {
@@ -540,10 +540,10 @@ public final class ParserSet {
                        return pm;
 
                ContentType ct = contentType(contentTypeHeader);
-               int match = ct.match(mediaTypes);
+               int match = ct.match(ulist(mediaTypes));
 
                if (match >= 0) {
-                       pm = new ParserMatch(mediaTypes.get(match), 
mediaTypeParsers.get(match));
+                       pm = new ParserMatch(mediaTypes[match], 
mediaTypeParsers[match]);
                        cache.putIfAbsent(contentTypeHeader, pm);
                }
 
@@ -591,7 +591,7 @@ public final class ParserSet {
         * @return An unmodifiable list of media types.
         */
        public List<MediaType> getSupportedMediaTypes() {
-               return mediaTypes;
+               return ulist(mediaTypes);
        }
 
        /**
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/AnnotationInfo.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/AnnotationInfo.java
index 5120055..40a2be5 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/AnnotationInfo.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/AnnotationInfo.java
@@ -14,6 +14,7 @@ package org.apache.juneau.reflect;
 
 import static org.apache.juneau.internal.CollectionUtils.*;
 import static org.apache.juneau.internal.ConsumerUtils.*;
+import static org.apache.juneau.internal.ObjectUtils.*;
 import static org.apache.juneau.internal.ThrowableUtils.*;
 
 import java.lang.annotation.*;
@@ -38,12 +39,13 @@ import org.apache.juneau.svl.*;
  *
  * @param <T> The annotation type.
  */
-public class AnnotationInfo<T extends Annotation> {
+public final class AnnotationInfo<T extends Annotation> {
 
        private final ClassInfo c;
        private final MethodInfo m;
        private final Package p;
        private final T a;
+       private volatile Method[] methods;
        final int rank;
 
        /**
@@ -158,19 +160,19 @@ public class AnnotationInfo<T extends Annotation> {
                if (p != null)
                        jm.put("package", p.getName());
                JsonMap ja = new JsonMap();
-               Class<?> ca = a.annotationType();
-               for (Method m : ca.getDeclaredMethods()) {
+               ClassInfo ca = ClassInfo.of(a.annotationType());
+               ca.forEachDeclaredMethod(null, x -> {
                        try {
-                               Object v = m.invoke(a);
-                               Object d = m.getDefaultValue();
-                               if (! Objects.equals(v, d)) {
+                               Object v = x.invoke(a);
+                               Object d = x.inner().getDefaultValue();
+                               if (ne(v, d)) {
                                        if (! (ArrayUtils.isArray(v) && 
Array.getLength(v) == 0 && Array.getLength(d) == 0))
                                                ja.put(m.getName(), v);
                                }
                        } catch (Exception e) {
                                ja.put(m.getName(), e.getLocalizedMessage());
                        }
-               }
+               });
                jm.put("@" + ca.getSimpleName(), ja);
                return jm;
        }
@@ -290,7 +292,7 @@ public class AnnotationInfo<T extends Annotation> {
         */
        @SuppressWarnings("unchecked")
        public <V> AnnotationInfo<?> forEachValue(Class<V> type, String name, 
Predicate<V> test, Consumer<V> action) {
-               for (Method m : a.annotationType().getMethods())
+               for (Method m : _getMethods())
                        if (m.getName().equals(name) && 
m.getReturnType().equals(type))
                                safeRun(() -> consume(test, action, 
(V)m.invoke(a)));
                return this;
@@ -306,7 +308,7 @@ public class AnnotationInfo<T extends Annotation> {
         */
        @SuppressWarnings("unchecked")
        public <V> Optional<V> getValue(Class<V> type, String name, 
Predicate<V> test) {
-               for (Method m : a.annotationType().getMethods())
+               for (Method m : _getMethods())
                        if (m.getName().equals(name) && 
m.getReturnType().equals(type)) {
                                try {
                                        V v = (V)m.invoke(a);
@@ -318,4 +320,12 @@ public class AnnotationInfo<T extends Annotation> {
                        }
                return empty();
        }
+
+       Method[] _getMethods() {
+               if (methods == null)
+                       synchronized(this) {
+                               methods = a.annotationType().getMethods();
+                       }
+               return methods;
+       }
 }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/AnnotationList.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/AnnotationList.java
index 6d0ec64..c29d2e7 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/AnnotationList.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/AnnotationList.java
@@ -28,7 +28,7 @@ import java.util.function.*;
  *
  * @serial exclude
  */
-public class AnnotationList extends ArrayList<AnnotationInfo<?>> {
+public final class AnnotationList extends ArrayList<AnnotationInfo<?>> {
        private static final long serialVersionUID = 1L;
 
        private static final Comparator<AnnotationInfo<?>> RANK_COMPARATOR = 
new Comparator<AnnotationInfo<?>>() {
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ClassInfo.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ClassInfo.java
index 6e72595..de5d4ed 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ClassInfo.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ClassInfo.java
@@ -45,7 +45,7 @@ import org.apache.juneau.internal.*;
  *     ClassInfo <jv>classInfo</jv> = 
ClassInfo.<jsm>of</jsm>(MyClass.<jk>class</jk>);
  *
  *     <jc>// Get all methods in parent-to-child order, sorted alphabetically 
per class.</jc>
- *     <jk>for</jk> (MethodInfo <jv>methodInfo</jv> : 
<jv>classInfo</jv>.getAllMethodsParentFirst()) {
+ *     <jk>for</jk> (MethodInfo <jv>methodInfo</jv> : 
<jv>classInfo</jv>.getAllMethods()) {
  *             <jc>// Do something with it.</jc>
  *     }
  *
@@ -169,6 +169,7 @@ public final class ClassInfo {
        private volatile MethodInfo repeatedAnnotationMethod;
        private volatile ConstructorInfo[] publicConstructors, 
declaredConstructors;
        private volatile FieldInfo[] publicFields, declaredFields, allFields;
+       private volatile Annotation[] declaredAnnotations;
        private int dim = -1;
        private ClassInfo componentType;
 
@@ -281,7 +282,7 @@ public final class ClassInfo {
         * @return
         *      The parent class, or <jk>null</jk> if the class has no parent.
         */
-       public ClassInfo getParent() {
+       public ClassInfo getSuperclass() {
                return c == null ? null : of(c.getSuperclass());
        }
 
@@ -362,56 +363,64 @@ public final class ClassInfo {
        }
 
        /** Results are in child-to-parent order. */
-       synchronized ClassInfo[] _getInterfaces() {
+       ClassInfo[] _getInterfaces() {
                if (interfaces == null) {
-                       Set<ClassInfo> s = set();
-                       for (ClassInfo ci : _getParents())
-                               for (ClassInfo ci2 : 
ci._getDeclaredInterfaces()) {
-                                       s.add(ci2);
-                                       for (ClassInfo ci3 : 
ci2._getInterfaces())
-                                               s.add(ci3);
-                               }
-                       interfaces = s.toArray(new ClassInfo[s.size()]);
+                       synchronized(this) {
+                               Set<ClassInfo> s = set();
+                               for (ClassInfo ci : _getParents())
+                                       for (ClassInfo ci2 : 
ci._getDeclaredInterfaces()) {
+                                               s.add(ci2);
+                                               for (ClassInfo ci3 : 
ci2._getInterfaces())
+                                                       s.add(ci3);
+                                       }
+                               interfaces = s.toArray(new ClassInfo[s.size()]);
+                       }
                }
                return interfaces;
        }
 
        /** Results are in the same order as Class.getInterfaces(). */
-       private synchronized ClassInfo[] _getDeclaredInterfaces() {
+       ClassInfo[] _getDeclaredInterfaces() {
                if (declaredInterfaces == null) {
-                       Class<?>[] ii = c == null ? new Class[0] : 
c.getInterfaces();
-                       ClassInfo[] l = new ClassInfo[ii.length];
-                       for (int i = 0; i < ii.length; i++)
-                               l[i] = of(ii[i]);
-                       declaredInterfaces = l;
+                       synchronized(this) {
+                               Class<?>[] ii = c == null ? new Class[0] : 
c.getInterfaces();
+                               ClassInfo[] l = new ClassInfo[ii.length];
+                               for (int i = 0; i < ii.length; i++)
+                                       l[i] = of(ii[i]);
+                               declaredInterfaces = l;
+                       }
                }
                return declaredInterfaces;
        }
 
        /** Results are in child-to-parent order. */
-       synchronized ClassInfo[] _getParents() {
+       ClassInfo[] _getParents() {
                if (parents == null) {
-                       List<ClassInfo> l = list();
-                       Class<?> pc = c;
-                       while (pc != null && pc != Object.class) {
-                               l.add(of(pc));
-                               pc = pc.getSuperclass();
+                       synchronized(this) {
+                               List<ClassInfo> l = list();
+                               Class<?> pc = c;
+                               while (pc != null && pc != Object.class) {
+                                       l.add(of(pc));
+                                       pc = pc.getSuperclass();
+                               }
+                               parents = l.toArray(new ClassInfo[l.size()]);
                        }
-                       parents = l.toArray(new ClassInfo[l.size()]);
                }
                return parents;
        }
 
        /** Results are classes-before-interfaces, then child-to-parent order. 
*/
-       private synchronized ClassInfo[] _getAllParents() {
+       ClassInfo[] _getAllParents() {
                if (allParents == null) {
-                       ClassInfo[] a1 = _getParents(), a2 = _getInterfaces();
-                       ClassInfo[] l = new ClassInfo[a1.length + a2.length];
-                       for (int i = 0; i < a1.length; i++)
-                               l[i] = a1[i];
-                       for (int i = 0; i < a2.length; i++)
-                               l[i+a1.length] = a2[i];
-                       allParents = l;
+                       synchronized(this) {
+                               ClassInfo[] a1 = _getParents(), a2 = 
_getInterfaces();
+                               ClassInfo[] l = new ClassInfo[a1.length + 
a2.length];
+                               for (int i = 0; i < a1.length; i++)
+                                       l[i] = a1[i];
+                               for (int i = 0; i < a2.length; i++)
+                                       l[i+a1.length] = a2[i];
+                               allParents = l;
+                       }
                }
                return allParents;
        }
@@ -561,7 +570,7 @@ public final class ClassInfo {
                return this;
        }
 
-       private synchronized MethodInfo[] _getPublicMethods() {
+       MethodInfo[] _getPublicMethods() {
                if (publicMethods == null) {
                        synchronized(this) {
                                Method[] mm = c == null ? new Method[0] : 
c.getMethods();
@@ -576,7 +585,7 @@ public final class ClassInfo {
                return publicMethods;
        }
 
-       private synchronized MethodInfo[] _getDeclaredMethods() {
+       MethodInfo[] _getDeclaredMethods() {
                if (declaredMethods == null) {
                        synchronized(this) {
                                Method[] mm = c == null ? new Method[0] : 
c.getDeclaredMethods();
@@ -591,7 +600,7 @@ public final class ClassInfo {
                return declaredMethods;
        }
 
-       private synchronized MethodInfo[] _getAllMethods() {
+       MethodInfo[] _getAllMethods() {
                if (allMethods == null) {
                        synchronized(this) {
                                List<MethodInfo> l = list();
@@ -603,7 +612,7 @@ public final class ClassInfo {
                return allMethods;
        }
 
-       private synchronized MethodInfo[] _getAllMethodsParentFirst() {
+       MethodInfo[] _getAllMethodsParentFirst() {
                if (allMethodsParentFirst == null) {
                        synchronized(this) {
                                List<MethodInfo> l = list();
@@ -698,7 +707,7 @@ public final class ClassInfo {
                return null;
        }
 
-       private synchronized ConstructorInfo[] _getPublicConstructors() {
+       ConstructorInfo[] _getPublicConstructors() {
                if (publicConstructors == null) {
                        synchronized(this) {
                                Constructor<?>[] cc = c == null ? new 
Constructor[0] : c.getConstructors();
@@ -712,7 +721,7 @@ public final class ClassInfo {
                return publicConstructors;
        }
 
-       private synchronized ConstructorInfo[] _getDeclaredConstructors() {
+       ConstructorInfo[] _getDeclaredConstructors() {
                if (declaredConstructors == null) {
                        synchronized(this) {
                                Constructor<?>[] cc = c == null ? new 
Constructor[0] : c.getDeclaredConstructors();
@@ -864,7 +873,7 @@ public final class ClassInfo {
                return this;
        }
 
-       private FieldInfo[] _getPublicFields() {
+       FieldInfo[] _getPublicFields() {
                if (publicFields == null) {
                        synchronized(this) {
                                Map<String,FieldInfo> m = map();
@@ -883,7 +892,7 @@ public final class ClassInfo {
                return publicFields;
        }
 
-       private synchronized FieldInfo[] _getDeclaredFields() {
+       FieldInfo[] _getDeclaredFields() {
                if (declaredFields == null) {
                        synchronized(this) {
                                Field[] ff = c == null ? new Field[0] : 
c.getDeclaredFields();
@@ -898,7 +907,7 @@ public final class ClassInfo {
                return declaredFields;
        }
 
-       private synchronized FieldInfo[] _getAllFields() {
+       FieldInfo[] _getAllFields() {
                if (allFields == null) {
                        synchronized(this) {
                                List<FieldInfo> l = list();
@@ -1256,7 +1265,7 @@ public final class ClassInfo {
                A t = ap.firstDeclaredAnnotation(a, c, x -> true);
                if (t != null)
                        return t;
-               ClassInfo sci = getParent();
+               ClassInfo sci = getSuperclass();
                if (sci != null) {
                        t = sci.getAnnotation(ap, a);
                        if (t != null)
@@ -1326,6 +1335,15 @@ public final class ClassInfo {
                return this;
        }
 
+       Annotation[] _getDeclaredAnnotations() {
+               if (declaredAnnotations == null) {
+                       synchronized(this) {
+                               declaredAnnotations = 
c.getDeclaredAnnotations();
+                       }
+               }
+               return declaredAnnotations;
+       }
+
        
//-----------------------------------------------------------------------------------------------------------------
        // Characteristics
        
//-----------------------------------------------------------------------------------------------------------------
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ExecutableInfo.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ExecutableInfo.java
index b3f6cf5..e1501b7 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ExecutableInfo.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ExecutableInfo.java
@@ -162,7 +162,7 @@ public abstract class ExecutableInfo {
         * @return The parameter types on this executable.
         */
        public final List<ClassInfo> getParamTypes() {
-               return ulist(_getParamTypes());
+               return ulist(_getParameterTypes());
        }
 
        /**
@@ -173,7 +173,7 @@ public abstract class ExecutableInfo {
         */
        public final ClassInfo getParamType(int index) {
                checkIndex(index);
-               return _getParamTypes()[index];
+               return _getParameterTypes()[index];
        }
 
        /**
@@ -238,7 +238,7 @@ public abstract class ExecutableInfo {
                return _getRawParameters()[index];
        }
 
-       private ParamInfo[] _getParams() {
+       final ParamInfo[] _getParams() {
                if (params == null) {
                        synchronized(this) {
                                Parameter[] rp = _getRawParameters();
@@ -251,7 +251,7 @@ public abstract class ExecutableInfo {
                return params;
        }
 
-       ClassInfo[] _getParamTypes() {
+       final ClassInfo[] _getParameterTypes() {
                if (paramTypes == null) {
                        synchronized(this) {
                                Class<?>[] ptc = _getRawParamTypes();
@@ -289,7 +289,7 @@ public abstract class ExecutableInfo {
                return rawParamTypes;
        }
 
-       private Type[] _getRawGenericParamTypes() {
+       final Type[] _getRawGenericParamTypes() {
                if (rawGenericParamTypes == null) {
                        synchronized(this) {
                                rawGenericParamTypes = 
e.getGenericParameterTypes();
@@ -298,7 +298,7 @@ public abstract class ExecutableInfo {
                return rawGenericParamTypes;
        }
 
-       private Parameter[] _getRawParameters() {
+       final Parameter[] _getRawParameters() {
                if (rawParameters == null) {
                        synchronized(this) {
                                rawParameters = e.getParameters();
@@ -328,8 +328,8 @@ public abstract class ExecutableInfo {
         * @param consumer The consumer.
         * @return This object.
         */
-       public <A extends Annotation> ExecutableInfo 
forEachParameterAnnotation(int index, Class<A> type, Predicate<A> predicate, 
Consumer<A> consumer) {
-               for (Annotation a : getParameterAnnotations(index))
+       public final <A extends Annotation> ExecutableInfo 
forEachParameterAnnotation(int index, Class<A> type, Predicate<A> predicate, 
Consumer<A> consumer) {
+               for (Annotation a : _getParameterAnnotations(index))
                        if (type.isInstance(a))
                                consume(predicate, consumer, type.cast(a));
                return this;
@@ -344,7 +344,7 @@ public abstract class ExecutableInfo {
                return parameterAnnotations;
        }
 
-       final Annotation[] getParameterAnnotations(int index) {
+       final Annotation[] _getParameterAnnotations(int index) {
                checkIndex(index);
                Annotation[][] x = _getParameterAnnotations();
                int c = e.getParameterCount();
@@ -361,7 +361,7 @@ public abstract class ExecutableInfo {
                return x[index];
        }
 
-       final Annotation[] getDeclaredAnnotations() {
+       final Annotation[] _getDeclaredAnnotations() {
                if (declaredAnnotations == null) {
                        synchronized(this) {
                                declaredAnnotations = 
e.getDeclaredAnnotations();
@@ -383,7 +383,7 @@ public abstract class ExecutableInfo {
                return ulist(_getExceptionTypes());
        }
 
-       private ClassInfo[] _getExceptionTypes() {
+       final ClassInfo[] _getExceptionTypes() {
                if (exceptionInfos == null) {
                        synchronized(this) {
                                Class<?>[] exceptionTypes = 
e.getExceptionTypes();
@@ -470,7 +470,7 @@ public abstract class ExecutableInfo {
         * @param flags The flags to test for.
         * @return <jk>true</jk> if all specified flags are applicable to this 
field.
         */
-       public boolean is(ReflectFlags...flags) {
+       public final boolean is(ReflectFlags...flags) {
                return isAll(flags);
        }
 
@@ -579,7 +579,7 @@ public abstract class ExecutableInfo {
         * @return <jk>true</jk> if this method has this arguments in the exact 
order.
         */
        public final boolean hasMatchingParamTypes(Class<?>...args) {
-               ClassInfo[] pt = _getParamTypes();
+               ClassInfo[] pt = _getParameterTypes();
                if (pt.length != args.length)
                        return false;
                for (int i = 0; i < pt.length; i++) {
@@ -600,7 +600,7 @@ public abstract class ExecutableInfo {
         * @return <jk>true</jk> if this method has this arguments in the exact 
order.
         */
        public final boolean hasMatchingParamTypes(ClassInfo...args) {
-               ClassInfo[] pt = _getParamTypes();
+               ClassInfo[] pt = _getParameterTypes();
                if (pt.length != args.length)
                        return false;
                for (int i = 0; i < pt.length; i++) {
@@ -634,7 +634,7 @@ public abstract class ExecutableInfo {
         * @param argTypes The arg types to check against.
         * @return How many parameters match or <c>-1</c> if method cannot 
handle one or more of the arguments.
         */
-       public int fuzzyArgsMatch(Class<?>... argTypes) {
+       public final int fuzzyArgsMatch(Class<?>... argTypes) {
                int matches = 0;
                outer: for (ClassInfo pi : getParamTypes()) {
                        for (Class<?> a : argTypes) {
@@ -658,7 +658,7 @@ public abstract class ExecutableInfo {
         * @param argTypes The arg types to check against.
         * @return How many parameters match or <c>-1</c> if method cannot 
handle one or more of the arguments.
         */
-       public int fuzzyArgsMatch(Object... argTypes) {
+       public final int fuzzyArgsMatch(Object... argTypes) {
                int matches = 0;
                outer: for (ClassInfo pi : getParamTypes()) {
                        for (Object a : argTypes) {
@@ -678,7 +678,7 @@ public abstract class ExecutableInfo {
         * @param args The arguments to test for.
         * @return <jk>true</jk> if this method has at most only this arguments 
in any order.
         */
-       public boolean hasFuzzyParamTypes(ClassInfo...args) {
+       public final boolean hasFuzzyParamTypes(ClassInfo...args) {
                return fuzzyArgsMatch(args) != -1;
        }
 
@@ -692,7 +692,7 @@ public abstract class ExecutableInfo {
         * @param argTypes The arg types to check against.
         * @return How many parameters match or <c>-1</c> if method cannot 
handle one or more of the arguments.
         */
-       public int fuzzyArgsMatch(ClassInfo... argTypes) {
+       public final int fuzzyArgsMatch(ClassInfo... argTypes) {
                int matches = 0;
                outer: for (ClassInfo pi : getParamTypes()) {
                        for (ClassInfo a : argTypes) {
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/MethodInfo.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/MethodInfo.java
index 08e3af9..7db33bc 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/MethodInfo.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/MethodInfo.java
@@ -133,7 +133,7 @@ public final class MethodInfo extends ExecutableInfo 
implements Comparable<Metho
         */
        public int canAcceptFuzzy(Object...args) {
                int matches = 0;
-               outer: for (ClassInfo pi : getParamTypes()) {
+               outer: for (ClassInfo pi : _getParameterTypes()) {
                        for (Object a : args) {
                                if (pi.canAcceptArg(a)) {
                                        matches++;
@@ -178,29 +178,29 @@ public final class MethodInfo extends ExecutableInfo 
implements Comparable<Metho
                return this;
        }
 
-       private static List<MethodInfo> findMatching(List<MethodInfo> l, Method 
m, Class<?> c) {
-               for (Method m2 : c.getDeclaredMethods())
-                       if (m.getName().equals(m2.getName()) && 
Arrays.equals(m.getParameterTypes(), m2.getParameterTypes()))
-                               l.add(MethodInfo.of(m2));
-               Class<?> pc = c.getSuperclass();
+       private static List<MethodInfo> findMatching(List<MethodInfo> l, 
MethodInfo m, ClassInfo c) {
+               for (MethodInfo m2 : c._getDeclaredMethods())
+                       if (m.hasName(m2.getName()) && 
Arrays.equals(m._getParameterTypes(), m2._getParameterTypes()))
+                               l.add(m2);
+               ClassInfo pc = c.getSuperclass();
                if (pc != null)
                        findMatching(l, m, pc);
-               for (Class<?> ic : c.getInterfaces())
+               for (ClassInfo ic : c._getDeclaredInterfaces())
                        findMatching(l, m, ic);
                return l;
        }
 
        private MethodInfo findMatchingOnClass(ClassInfo c) {
-               for (Method m2 : c.inner().getDeclaredMethods())
-                       if (m.getName().equals(m2.getName()) && 
Arrays.equals(m.getParameterTypes(), m2.getParameterTypes()))
-                               return MethodInfo.of(m2);
+               for (MethodInfo m2 : c._getDeclaredMethods())
+                       if (hasName(m2.getName()) && 
Arrays.equals(_getParameterTypes(), m2._getParameterTypes()))
+                               return m2;
                return null;
        }
 
-       private MethodInfo[] _getMatching() {
+       MethodInfo[] _getMatching() {
                if (matching == null) {
                        synchronized(this) {
-                               List<MethodInfo> l = findMatching(list(), m, 
m.getDeclaringClass());
+                               List<MethodInfo> l = findMatching(list(), this, 
getDeclaringClass());
                                matching = l.toArray(new MethodInfo[l.size()]);
                        }
                }
@@ -343,7 +343,7 @@ public final class MethodInfo extends ExecutableInfo 
implements Comparable<Metho
                declaringClass.forEachAnnotation(annotationProvider, type, 
filter, action);
                MethodInfo[] m = _getMatching();
                for (int i = m.length-1; i >= 0; i--)
-                       for (Annotation a2 : m[i].getDeclaredAnnotations())
+                       for (Annotation a2 : m[i]._getDeclaredAnnotations())
                                consume(type, filter, action, a2);
                
getReturnType().unwrap(Value.class,Optional.class).forEachAnnotation(annotationProvider,
 type, filter, action);
                return this;
@@ -459,14 +459,14 @@ public final class MethodInfo extends ExecutableInfo 
implements Comparable<Metho
 
        private void forEachDeclaredAnnotationInfo(ClassInfo ci, 
Predicate<AnnotationInfo<?>> filter, Consumer<AnnotationInfo<?>> action) {
                if (ci != null)
-                       for (Annotation a : ci.c.getDeclaredAnnotations())
+                       for (Annotation a : ci._getDeclaredAnnotations())
                                AnnotationInfo.of(ci, a).accept(filter, action);
        }
 
        private void forEachDeclaredMethodAnnotationInfo(ClassInfo ci, 
Predicate<AnnotationInfo<?>> filter, Consumer<AnnotationInfo<?>> action) {
                MethodInfo m = findMatchingOnClass(ci);
                if (m != null)
-                       for (Annotation a : m.getDeclaredAnnotations())
+                       for (Annotation a : m._getDeclaredAnnotations())
                                AnnotationInfo.of(m, a).accept(filter, action);
        }
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ParamInfo.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ParamInfo.java
index 8494ad9..f6f1434 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ParamInfo.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ParamInfo.java
@@ -105,7 +105,7 @@ public final class ParamInfo {
         * @return This object.
         */
        public <A extends Annotation> ParamInfo 
forEachDeclaredAnnotation(Class<A> type, Predicate<A> filter, Consumer<A> 
action) {
-               for (Annotation a : eInfo.getParameterAnnotations(index))
+               for (Annotation a : eInfo._getParameterAnnotations(index))
                        consume(type, filter, action, a);
                return this;
        }
@@ -121,7 +121,7 @@ public final class ParamInfo {
         */
        public <A extends Annotation> A getDeclaredAnnotation(Class<A> type) {
                if (type != null)
-                       for (Annotation a : 
eInfo.getParameterAnnotations(index))
+                       for (Annotation a : 
eInfo._getParameterAnnotations(index))
                                if (type.isInstance(a))
                                        return type.cast(a);
                return null;
@@ -179,7 +179,7 @@ public final class ParamInfo {
 
        private <A extends Annotation> A findAnnotation(Class<A> type) {
                if (eInfo.isConstructor()) {
-                       for (Annotation a2 : 
eInfo.getParameterAnnotations(index))
+                       for (Annotation a2 : 
eInfo._getParameterAnnotations(index))
                                if (type.isInstance(a2))
                                        return type.cast(a2);
                        return 
eInfo.getParamType(index).unwrap(Value.class,Optional.class).getAnnotation(type);
@@ -228,7 +228,7 @@ public final class ParamInfo {
                        A o = ci.getAnnotation(type, filter);
                        if (o != null)
                                return o;
-                       for (Annotation a2 : 
eInfo.getParameterAnnotations(index))
+                       for (Annotation a2 : 
eInfo._getParameterAnnotations(index))
                                if (passes(type, filter, a2))
                                        return (A)a2;
                } else {
@@ -247,7 +247,7 @@ public final class ParamInfo {
        private <A extends Annotation> ParamInfo 
forEachAnnotation(AnnotationProvider ap, Class<A> a, Predicate<A> filter, 
Consumer<A> action) {
                if (eInfo.isConstructor) {
                        ClassInfo ci = 
eInfo.getParamType(index).unwrap(Value.class,Optional.class);
-                       Annotation[] annotations = 
eInfo.getParameterAnnotations(index);
+                       Annotation[] annotations = 
eInfo._getParameterAnnotations(index);
                        ci.forEachAnnotation(ap, a, filter, action);
                        for (Annotation a2 : annotations)
                                consume(a, filter, action, a2);
@@ -260,7 +260,7 @@ public final class ParamInfo {
                return this;
        }
 
-       private synchronized Map<Class<?>,Optional<Annotation>> annotationMap() 
{
+       private Map<Class<?>,Optional<Annotation>> annotationMap() {
                if (annotationMap == null) {
                        synchronized(this) {
                                annotationMap = new ConcurrentHashMap<>();
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/reflect/ClassInfoTest.java 
b/juneau-utest/src/test/java/org/apache/juneau/reflect/ClassInfoTest.java
index 0ed2efd..c960ab6 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/reflect/ClassInfoTest.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/reflect/ClassInfoTest.java
@@ -270,21 +270,21 @@ public class ClassInfoTest {
 
        @Test
        public void getParent() {
-               check("BC2", bc3.getParent());
-               check("BC1", bc2.getParent());
-               check("Object", bc1.getParent());
-               check(null, object.getParent());
-               check(null, bi2.getParent());
-               check(null, bi1.getParent());
+               check("BC2", bc3.getSuperclass());
+               check("BC1", bc2.getSuperclass());
+               check("Object", bc1.getSuperclass());
+               check(null, object.getSuperclass());
+               check(null, bi2.getSuperclass());
+               check(null, bi1.getSuperclass());
        }
 
        @Test
        public void getParent_onType() {
-               check("Object", aTypeInfo.getParent());
-               check(null, pTypeInfo.getParent());
-               check(null, pTypeDimensionalInfo.getParent());
-               check("Object", pTypeGenericInfo.getParent());
-               check(null, pTypeGenericArgInfo.getParent());
+               check("Object", aTypeInfo.getSuperclass());
+               check(null, pTypeInfo.getSuperclass());
+               check(null, pTypeDimensionalInfo.getSuperclass());
+               check("Object", pTypeGenericInfo.getSuperclass());
+               check(null, pTypeGenericArgInfo.getSuperclass());
        }
 
        
//-----------------------------------------------------------------------------------------------------------------
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/reflect/ExecutableInfoTest.java 
b/juneau-utest/src/test/java/org/apache/juneau/reflect/ExecutableInfoTest.java
index 50f058d..79d883a 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/reflect/ExecutableInfoTest.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/reflect/ExecutableInfoTest.java
@@ -289,8 +289,8 @@ public class ExecutableInfoTest {
 
        @Test
        public void getParameterAnnotations_atIndex() {
-               check("@CA()", c_c2.getParameterAnnotations(0));
-               check("@CA()", c_m2.getParameterAnnotations(0));
+               check("@CA()", c_c2._getParameterAnnotations(0));
+               check("@CA()", c_m2._getParameterAnnotations(0));
        }
 
        @Test
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/utils/MultiSetTest.java 
b/juneau-utest/src/test/java/org/apache/juneau/utils/MultiSetTest.java
index a6bfbf0..9536790 100755
--- a/juneau-utest/src/test/java/org/apache/juneau/utils/MultiSetTest.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/utils/MultiSetTest.java
@@ -85,7 +85,7 @@ public class MultiSetTest {
 
                l1 = new LinkedList<>(Arrays.asList(new String[]{"1","2"}));
                l2 = new LinkedList<>(Arrays.asList(new String[]{"3","4"}));
-               ms = new MultiSet<>(l1).append(l2);
+               ms = new MultiSet<>(l1, l2);
                assertObject(ms).asJson().is("['1','2','3','4']");
                assertObject(ms.enumerator()).asJson().is("['1','2','3','4']");
                assertEquals(4, ms.size());

Reply via email to