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 919ffb5  New org.apache.juneau.reflection package.
919ffb5 is described below

commit 919ffb53f4e13532a798ebdd99aff95fc64696cd
Author: JamesBognar <[email protected]>
AuthorDate: Sun Mar 31 10:20:36 2019 -0400

    New org.apache.juneau.reflection package.
---
 .../apache/juneau/reflection/ClassInfoTest.java    |   2 +-
 .../juneau/reflection/ConstructorInfoTest.java     |  89 ++++++++++++++++
 .../src/main/java/org/apache/juneau/BeanMeta.java  |   2 +-
 .../apache/juneau/BeanProxyInvocationHandler.java  |   2 +-
 .../src/main/java/org/apache/juneau/ClassMeta.java |  18 ++--
 .../org/apache/juneau/internal/ClassUtils.java     |  65 ++++++++++++
 .../org/apache/juneau/reflection/ClassInfo.java    |  65 ++++++++----
 .../apache/juneau/reflection/ConstructorInfo.java  | 112 +++++++++------------
 .../org/apache/juneau/reflection/FieldInfo.java    |  18 ++--
 .../org/apache/juneau/reflection/MethodInfo.java   |  23 +++--
 .../apache/juneau/reflection/MethodParamInfo.java  |  16 +--
 .../org/apache/juneau/transform/BuilderSwap.java   |   7 +-
 .../org/apache/juneau/transform/SurrogateSwap.java |   8 +-
 13 files changed, 297 insertions(+), 130 deletions(-)

diff --git 
a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/reflection/ClassInfoTest.java
 
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/reflection/ClassInfoTest.java
index 20cb825..b17f29a 100644
--- 
a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/reflection/ClassInfoTest.java
+++ 
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/reflection/ClassInfoTest.java
@@ -1294,7 +1294,7 @@ public class ClassInfoTest {
 
        @Test
        public void isAny_onType() {
-               assertFalse(aTypeInfo.isAny());
+               assertFalse(aTypeInfo.isAny(new ClassFlags[0]));
        }
 
        @Test
diff --git 
a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/reflection/ConstructorInfoTest.java
 
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/reflection/ConstructorInfoTest.java
index 8de544a..592d6b4 100644
--- 
a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/reflection/ConstructorInfoTest.java
+++ 
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/reflection/ConstructorInfoTest.java
@@ -12,6 +12,95 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.reflection;
 
+import static org.junit.Assert.*;
+import static org.apache.juneau.reflection.ConstructorInfo.*;
+
+import java.lang.reflect.*;
+import java.util.*;
+import java.util.function.*;
+import java.util.stream.*;
+
+import org.junit.*;
+
 public class ConstructorInfoTest {
 
+       private static void check(String expected, Object o) {
+               if (o instanceof List) {
+                       List<?> l = (List<?>)o;
+                       String actual = l
+                               .stream()
+                               .map(TO_STRING)
+                               .collect(Collectors.joining(","));
+                       assertEquals(expected, actual);
+               } else if (o instanceof Iterable) {
+                       String actual = 
StreamSupport.stream(((Iterable<?>)o).spliterator(), false)
+                               .map(TO_STRING)
+                               .collect(Collectors.joining(","));
+                       assertEquals(expected, actual);
+               } else {
+                       assertEquals(expected, TO_STRING.apply(o));
+               }
+       }
+
+       private static final Function<Object,String> TO_STRING = new 
Function<Object,String>() {
+               @Override
+               public String apply(Object t) {
+                       if (t == null)
+                               return null;
+                       if (t instanceof Class)
+                               return ((Class<?>)t).getSimpleName();
+                       if (t instanceof Constructor) {
+                               Constructor<?> x = (Constructor<?>)t;
+                               return x.getDeclaringClass().getSimpleName() + 
'(' + argTypes(x.getParameterTypes()) + ')';
+                       }
+//                     if (t instanceof Package)
+//                             return ((Package)t).getName();
+                       if (t instanceof ClassInfo)
+                               return ((ClassInfo)t).getSimpleName();
+//                     if (t instanceof MethodInfo)
+//                             return 
((MethodInfo)t).getDeclaringClass().getSimpleName() + '.' + 
((MethodInfo)t).getLabel();
+//                     if (t instanceof ConstructorInfo)
+//                             return ((ConstructorInfo)t).getLabel();
+//                     if (t instanceof FieldInfo)
+//                             return 
((FieldInfo)t).getDeclaringClass().getSimpleName() + '.' + 
((FieldInfo)t).getLabel();
+//                     if (t instanceof AnnotationInfo)
+//                             return 
apply(((AnnotationInfo<?>)t).getAnnotation());
+                       return t.toString();
+               }
+       };
+
+       private static String argTypes(Class<?>[] t) {
+               return Arrays.asList(t).stream().map(x -> 
x.getSimpleName()).collect(Collectors.joining(","));
+       }
+
+       private static ConstructorInfo ofc(Class<?> c, Class<?>...pt) {
+               try {
+                       return of(c.getConstructor(pt));
+               } catch (NoSuchMethodException | SecurityException e) {
+                       e.printStackTrace();
+                       fail(e.getLocalizedMessage());
+               }
+               return null;
+       }
+
+       
//-----------------------------------------------------------------------------------------------------------------
+       // Instantiation.
+       
//-----------------------------------------------------------------------------------------------------------------
+
+       static class A {
+               public A() {}
+       }
+       ConstructorInfo a = ofc(A.class);
+
+       @Test
+       public void of_noDeclaringClass() throws Exception {
+               check("A()", a.inner());
+       }
+
+       @Test
+       public void getDeclaringClass() throws Exception {
+               check("A", a.getDeclaringClass());
+       }
+
+
 }
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 b6a5bc4..6db7241 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
@@ -224,7 +224,7 @@ public class BeanMeta<T> {
                                                        throw new 
BeanRuntimeException(c, "Multiple instances of '@BeanConstructor' found.");
                                                constructor = x;
                                                constructorArgs = 
split(x.getAnnotation(BeanConstructor.class).properties());
-                                               if (constructorArgs.length != 
x.getParameterTypes().length)
+                                               if (constructorArgs.length != 
x.getParameterTypes().size())
                                                        throw new 
BeanRuntimeException(c, "Number of properties defined in '@BeanConstructor' 
annotation does not match number of parameters in constructor.");
                                                constructor.setAccessible();
                                        }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanProxyInvocationHandler.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanProxyInvocationHandler.java
index e4e6580..fdfbcd8 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanProxyInvocationHandler.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanProxyInvocationHandler.java
@@ -47,7 +47,7 @@ public class BeanProxyInvocationHandler<T> implements 
InvocationHandler {
         */
        @Override /* InvocationHandler */
        public Object invoke(Object proxy, Method method, Object[] args) {
-               MethodInfo mi = new MethodInfo(method);
+               MethodInfo mi = MethodInfo.of(method);
                if (mi.hasName("equals") && mi.hasArgs(java.lang.Object.class)) 
{
                        Object arg = args[0];
                        if (arg == null)
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 34db993..1fc7582 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
@@ -573,18 +573,18 @@ public final class ClassMeta<T> implements Type {
                        // Find constructor(String) method if present.
                        for (ConstructorInfo cs : ci.getPublicConstructors()) {
                                if (cs.isPublic() && cs.isNotDeprecated()) {
-                                       Class<?>[] pt = cs.getParameterTypes();
-                                       if (pt.length == (isMemberClass ? 1 : 
0) && c != Object.class && ! isAbstract) {
+                                       List<ClassInfo> pt = 
cs.getParameterTypes();
+                                       if (pt.size() == (isMemberClass ? 1 : 
0) && c != Object.class && ! isAbstract) {
                                                noArgConstructor = cs;
-                                       } else if (pt.length == (isMemberClass 
? 2 : 1)) {
-                                               Class<?> arg = 
pt[(isMemberClass ? 1 : 0)];
-                                               if (arg == String.class)
+                                       } else if (pt.size() == (isMemberClass 
? 2 : 1)) {
+                                               ClassInfo arg = 
pt.get(isMemberClass ? 1 : 0);
+                                               if (arg.is(String.class))
                                                        stringConstructor = cs;
-                                               else if (swapMethodType != null 
&& swapMethodType.isAssignableFrom(arg))
+                                               else if (swapMethodType != null 
&& arg.isChildOf(swapMethodType))
                                                        swapConstructor = 
(Constructor<T>)cs.inner();
-                                               else if (cc != NUMBER && 
(Number.class.isAssignableFrom(arg) || (arg.isPrimitive() && (arg == int.class 
|| arg == short.class || arg == long.class || arg == float.class || arg == 
double.class)))) {
+                                               else if (cc != NUMBER && 
(arg.isChildOf(Number.class) || (arg.isPrimitive() && (arg.isAny(int.class, 
short.class, long.class, float.class, double.class))))) {
                                                        numberConstructor = cs;
-                                                       numberConstructorType = 
getClassInfo(arg).getWrapperIfPrimitive();
+                                                       numberConstructorType = 
arg.getWrapperIfPrimitive();
                                                }
                                        }
                                }
@@ -1846,7 +1846,7 @@ public final class ClassMeta<T> implements Type {
        public T newInstanceFromNumber(BeanSession session, Object outer, 
Number arg) throws IllegalArgumentException, IllegalAccessException, 
InvocationTargetException, InstantiationException {
                ConstructorInfo c = numberConstructor;
                if (c != null) {
-                       Object arg2 = session.convertToType(arg, 
numberConstructor.getParameterTypes()[0]);
+                       Object arg2 = session.convertToType(arg, 
numberConstructor.getParameterTypes().get(0).inner());
                        if (isMemberClass)
                                return c.<T>invoke(outer, arg2);
                        return c.<T>invoke(arg2);
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ClassUtils.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ClassUtils.java
index 2a02346..a139ad6 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ClassUtils.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ClassUtils.java
@@ -105,6 +105,23 @@ public final class ClassUtils {
        }
 
        /**
+        * Returns <jk>true</jk> if the specified argument types are valid for 
the specified parameter types.
+        *
+        * @param paramTypes The parameters types specified on a method.
+        * @param argTypes The class types of the arguments being passed to the 
method.
+        * @return <jk>true</jk> if the arguments match the parameters.
+        */
+       public static boolean argsMatch(List<ClassInfo> paramTypes, Class<?>[] 
argTypes) {
+               if (paramTypes.size() == argTypes.length) {
+                       for (int i = 0; i < paramTypes.size(); i++)
+                               if (! paramTypes.get(i).isParentOf(argTypes[i]))
+                                       return false;
+                       return true;
+               }
+               return false;
+       }
+
+       /**
         * Returns a number representing the number of arguments that match the 
specified parameters.
         *
         * @param paramTypes The parameters types specified on a method.
@@ -127,6 +144,28 @@ public final class ClassUtils {
        }
 
        /**
+        * Returns a number representing the number of arguments that match the 
specified parameters.
+        *
+        * @param paramTypes The parameters types specified on a method.
+        * @param argTypes The class types of the arguments being passed to the 
method.
+        * @return The number of matching arguments, or <code>-1</code> a 
parameter was found that isn't in the list of args.
+        */
+       public static int fuzzyArgsMatch(List<ClassInfo> paramTypes, 
Class<?>... argTypes) {
+               int matches = 0;
+               outer: for (ClassInfo p : paramTypes) {
+                       p = p.getWrapperInfoIfPrimitive();
+                       for (Class<?> a : argTypes) {
+                               if (p.isParentOf(a)) {
+                                       matches++;
+                                       continue outer;
+                               }
+                       }
+                       return -1;
+               }
+               return matches;
+       }
+
+       /**
         * Returns the class types for the specified arguments.
         *
         * @param args The objects we're getting the classes of.
@@ -269,6 +308,32 @@ public final class ClassUtils {
        }
 
        /**
+        * Matches arguments to a list of parameter types.
+        *
+        * <p>
+        * Extra parameters are ignored.
+        * <br>Missing parameters are left null.
+        *
+        * @param paramTypes The parameter types.
+        * @param args The arguments to match to the parameter types.
+        * @return
+        *      An array of parameters.
+        */
+       public static Object[] getMatchingArgs(List<ClassInfo> paramTypes, 
Object... args) {
+               Object[] params = new Object[paramTypes.size()];
+               for (int i = 0; i < paramTypes.size(); i++) {
+                       ClassInfo pt = 
paramTypes.get(i).getWrapperInfoIfPrimitive();
+                       for (int j = 0; j < args.length; j++) {
+                               if (pt.isParentOf(args[j].getClass())) {
+                                       params[i] = args[j];
+                                       break;
+                               }
+                       }
+               }
+               return params;
+       }
+
+       /**
         * Returns a readable representation of the specified method.
         *
         * <p>
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflection/ClassInfo.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflection/ClassInfo.java
index a1eb6ad..4b5b2be 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflection/ClassInfo.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflection/ClassInfo.java
@@ -67,26 +67,20 @@ public final class ClassInfo {
        private int dim = -1;
        private ClassInfo componentType;
 
-       /**
-        * Constructor.
-        *
-        * @param t The class type.
-        */
-       protected ClassInfo(Type t) {
-               this.t = t;
-               this.c = ClassUtils.toClass(t);
-               this.isParameterizedType = (t instanceof ParameterizedType);
-       }
+       
//-----------------------------------------------------------------------------------------------------------------
+       // Instantiation.
+       
//-----------------------------------------------------------------------------------------------------------------
 
        /**
         * Constructor.
         *
         * @param c The class type.
+        * @param t The generic type (if parameterized type).
         */
-       protected ClassInfo(Class<?> c) {
-               this.t = c;
+       protected ClassInfo(Class<?> c, Type t) {
+               this.t = t;
                this.c = c;
-               this.isParameterizedType = false;
+               this.isParameterizedType = t == null ? false : (t instanceof 
ParameterizedType);
        }
 
        /**
@@ -98,7 +92,7 @@ public final class ClassInfo {
        public static ClassInfo of(Type t) {
                if (t == null)
                        return null;
-               return new ClassInfo(t);
+               return new ClassInfo(ClassUtils.toClass(t), t);
        }
 
        /**
@@ -110,7 +104,18 @@ public final class ClassInfo {
        public static ClassInfo of(Class<?> c) {
                if (c == null)
                        return null;
-               return new ClassInfo(c);
+               return new ClassInfo(c, c);
+       }
+
+       /**
+        * Returns a class info wrapper around the specified class type.
+        *
+        * @param c The class type.
+        * @param t The generic type (if parameterized type).
+        * @return The constructed class info, or <jk>null</jk> if the type was 
<jk>null</jk>.
+        */
+       public static ClassInfo of(Class<?> c, Type t) {
+               return new ClassInfo(c, t);
        }
 
        /**
@@ -122,7 +127,7 @@ public final class ClassInfo {
        public static ClassInfo of(Object o) {
                if (o == null)
                        return null;
-               return new ClassInfo(o.getClass());
+               return new ClassInfo(o.getClass(), o.getClass());
        }
 
        /**
@@ -367,7 +372,6 @@ public final class ClassInfo {
                return l;
        }
 
-
        
//-----------------------------------------------------------------------------------------------------------------
        // Special methods
        
//-----------------------------------------------------------------------------------------------------------------
@@ -557,9 +561,9 @@ public final class ClassInfo {
 
                boolean isMemberClass = isNonStaticMemberClass();
                for (ConstructorInfo n : getDeclaredConstructors()) {
-                       Class<?>[] paramTypes = n.getParameterTypes();
+                       List<ClassInfo> paramTypes = n.getParameterTypes();
                        if (isMemberClass)
-                               paramTypes = Arrays.copyOfRange(paramTypes, 1, 
paramTypes.length);
+                               paramTypes = paramTypes.subList(1, 
paramTypes.size());
                        if (ClassUtils.argsMatch(paramTypes, argTypes) && 
vis.isVisible(n.inner()))
                                return n;
                }
@@ -1600,6 +1604,29 @@ public final class ClassInfo {
        }
 
        /**
+        * Checks for equality with the specified class.
+        *
+        * @param c The class to check equality with.
+        * @return <jk>true</jk> if the specified class is the same as this one.
+        */
+       public boolean is(ClassInfo c) {
+               return this.c != null && this.c.equals(c.inner());
+       }
+
+       /**
+        * Returns <jk>true</jk> if this class is any of the specified types.
+        *
+        * @param types The types to check against.
+        * @return <jk>true</jk> if this class is any of the specified types.
+        */
+       public boolean isAny(Class<?>...types) {
+               for (Class<?> cc : types)
+                       if (is(cc))
+                               return true;
+               return false;
+       }
+
+       /**
         * Returns the package of this class.
         *
         * @return The package of this class.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflection/ConstructorInfo.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflection/ConstructorInfo.java
index 31c6a20..db4f0d8 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflection/ConstructorInfo.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflection/ConstructorInfo.java
@@ -14,6 +14,7 @@ package org.apache.juneau.reflection;
 
 import java.lang.annotation.*;
 import java.lang.reflect.*;
+import java.util.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
@@ -27,14 +28,19 @@ public final class ConstructorInfo implements 
Comparable<ConstructorInfo> {
 
        private final ClassInfo declaringClass;
        private final Constructor<?> c;
-       private MethodParamInfo[] params;
+       private List<MethodParamInfo> params;
+       private List<ClassInfo> paramTypes;
+
+       
//-----------------------------------------------------------------------------------------------------------------
+       // Instantiation.
+       
//-----------------------------------------------------------------------------------------------------------------
 
        /**
         * Constructor.
         *
         * @param c The constructor being wrapped.
         */
-       public ConstructorInfo(Constructor<?> c) {
+       protected ConstructorInfo(Constructor<?> c) {
                this(ClassInfo.of(c.getDeclaringClass()), c);
        }
 
@@ -44,7 +50,7 @@ public final class ConstructorInfo implements 
Comparable<ConstructorInfo> {
         * @param declaringClass The class that declares this method.
         * @param c The constructor being wrapped.
         */
-       public ConstructorInfo(ClassInfo declaringClass, Constructor<?> c) {
+       protected ConstructorInfo(ClassInfo declaringClass, Constructor<?> c) {
                this.declaringClass = declaringClass;
                this.c = c;
        }
@@ -93,16 +99,21 @@ public final class ConstructorInfo implements 
Comparable<ConstructorInfo> {
                return declaringClass;
        }
 
+       
//-----------------------------------------------------------------------------------------------------------------
+       // Parameters
+       
//-----------------------------------------------------------------------------------------------------------------
+
        /**
         * Returns the parameters defined on this method.
         *
         * @return An array of parameter information, never <jk>null</jk>.
         */
-       public MethodParamInfo[] getParams() {
+       public List<MethodParamInfo> getParams() {
                if (params == null) {
-                       params = new MethodParamInfo[c.getParameterCount()];
+                       List<MethodParamInfo> l = new 
ArrayList<>(c.getParameterCount());
                        for (int i = 0; i < c.getParameterCount(); i++)
-                               params[i] = new MethodParamInfo(this, i);
+                               l.add(new MethodParamInfo(this, i));
+                       params = Collections.unmodifiableList(l);
                }
                return params;
        }
@@ -114,7 +125,7 @@ public final class ConstructorInfo implements 
Comparable<ConstructorInfo> {
         * @return The parameter information, never <jk>null</jk>.
         */
        public MethodParamInfo getParam(int index) {
-               return getParams()[index];
+               return getParams().get(index);
        }
 
        /**
@@ -122,17 +133,18 @@ public final class ConstructorInfo implements 
Comparable<ConstructorInfo> {
         *
         * @return The parameter types on this constructor.
         */
-       public Class<?>[] getParameterTypes() {
-               return c.getParameterTypes();
-       }
-
-       /**
-        * Returns the generic parameter types on this constructor.
-        *
-        * @return The generic parameter types on this constructor.
-        */
-       public Type[] getGenericParameterTypes() {
-               return c.getGenericParameterTypes();
+       public List<ClassInfo> getParameterTypes() {
+               if (paramTypes == null) {
+                       // Note that due to a bug involving Enum constructors, 
getGenericParameterTypes() may
+                       // always return an empty array.
+                       Class<?>[] ptc = c.getParameterTypes();
+                       Type[] ptt = c.getGenericParameterTypes();
+                       List<ClassInfo> l = new ArrayList<>(ptc.length);
+                       for (int i = 0; i < ptc.length; i++)
+                               l.add(ClassInfo.of(ptc[i], ptt.length > i ? 
ptt[i] : ptc[i]));
+                       paramTypes = Collections.unmodifiableList(l);
+               }
+               return paramTypes;
        }
 
        /**
@@ -141,29 +153,13 @@ public final class ConstructorInfo implements 
Comparable<ConstructorInfo> {
         * @param index The parameter index.
         * @return The parameter type of the parameter at the specified index.
         */
-       public Class<?> getParameterType(int index) {
-               return getParameterTypes()[index];
+       public ClassInfo getParameterType(int index) {
+               return getParameterTypes().get(index);
        }
 
-       /**
-        * Returns the generic parameter type of the parameter at the specified 
index.
-        *
-        * @param index The parameter index.
-        * @return The generic parameter type of the parameter at the specified 
index.
-        */
-       public Type getGenericParameterType(int index) {
-               return getGenericParameterTypes()[index];
-       }
-
-       /**
-        * Returns the generic parameter type of the parameter at the specified 
index as a {@link ClassInfo} object.
-        *
-        * @param index The parameter index.
-        * @return The generic parameter type of the parameter at the specified 
index.
-        */
-       public ClassInfo getGenericParameterTypeInfo(int index) {
-               return ClassInfo.of(getGenericParameterType(index));
-       }
+       
//-----------------------------------------------------------------------------------------------------------------
+       // Annotations
+       
//-----------------------------------------------------------------------------------------------------------------
 
        /**
         * Returns the parameter annotations on this constructor.
@@ -241,15 +237,8 @@ public final class ConstructorInfo implements 
Comparable<ConstructorInfo> {
                                        if (isPublic())
                                                return false;
                                        break;
-                               case STATIC:
-                               case NOT_STATIC:
-                               case ABSTRACT:
-                               case NOT_ABSTRACT:
-                               case TRANSIENT:
-                               case NOT_TRANSIENT:
                                default:
-                                       break;
-
+                                       throw new RuntimeException("Invalid 
flag for constructor: " + f);
                        }
                }
                return true;
@@ -288,15 +277,8 @@ public final class ConstructorInfo implements 
Comparable<ConstructorInfo> {
                                        if (isNotPublic())
                                                return true;
                                        break;
-                               case STATIC:
-                               case NOT_STATIC:
-                               case ABSTRACT:
-                               case NOT_ABSTRACT:
-                               case TRANSIENT:
-                               case NOT_TRANSIENT:
                                default:
-                                       break;
-
+                                       throw new RuntimeException("Invalid 
flag for constructor: " + f);
                        }
                }
                return false;
@@ -309,10 +291,10 @@ public final class ConstructorInfo implements 
Comparable<ConstructorInfo> {
         * @return <jk>true</jk> if this constructor has this arguments in the 
exact order.
         */
        public boolean hasArgs(Class<?>...args) {
-               Class<?>[] pt = getParameterTypes();
-               if (pt.length == args.length) {
-                       for (int i = 0; i < pt.length; i++)
-                               if (! pt[i].equals(args[i]))
+               List<ClassInfo> pt = getParameterTypes();
+               if (pt.size() == args.length) {
+                       for (int i = 0; i < pt.size(); i++)
+                               if (! pt.get(i).inner().equals(args[i]))
                                        return false;
                        return true;
                }
@@ -325,7 +307,7 @@ public final class ConstructorInfo implements 
Comparable<ConstructorInfo> {
         * @return <jk>true</jk> if this constructor has one or more arguments.
         */
        public boolean hasArgs() {
-               return getParameterTypes().length > 0;
+               return ! getParameterTypes().isEmpty();
        }
 
        /**
@@ -334,7 +316,7 @@ public final class ConstructorInfo implements 
Comparable<ConstructorInfo> {
         * @return <jk>true</jk> if this constructor has zero arguments.
         */
        public boolean hasNoArgs() {
-               return getParameterTypes().length == 0;
+               return getParameterTypes().isEmpty();
        }
 
        /**
@@ -344,7 +326,7 @@ public final class ConstructorInfo implements 
Comparable<ConstructorInfo> {
         * @return <jk>true</jk> if this constructor has this number of 
arguments.
         */
        public boolean hasNumArgs(int number) {
-               return getParameterTypes().length == number;
+               return getParameterTypes().size() == number;
        }
 
        /**
@@ -467,10 +449,10 @@ public final class ConstructorInfo implements 
Comparable<ConstructorInfo> {
        public int compareTo(ConstructorInfo o) {
                int i = getName().compareTo(o.getName());
                if (i == 0) {
-                       i = getParameterTypes().length - 
o.getParameterTypes().length;
+                       i = getParameterTypes().size() - 
o.getParameterTypes().size();
                        if (i == 0) {
-                               for (int j = 0; j < getParameterTypes().length 
&& i == 0; j++) {
-                                       i = 
getParameterTypes()[j].getName().compareTo(o.getParameterTypes()[j].getName());
+                               for (int j = 0; j < getParameterTypes().size() 
&& i == 0; j++) {
+                                       i = 
getParameterTypes().get(j).inner().getName().compareTo(o.getParameterTypes().get(j).inner().getName());
                                }
                        }
                }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflection/FieldInfo.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflection/FieldInfo.java
index 2e55c63..10583a2 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflection/FieldInfo.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflection/FieldInfo.java
@@ -27,13 +27,17 @@ public final class FieldInfo implements 
Comparable<FieldInfo> {
        private final Field f;
        private ClassInfo declaringClass, type;
 
+       
//-----------------------------------------------------------------------------------------------------------------
+       // Instantiation.
+       
//-----------------------------------------------------------------------------------------------------------------
+
        /**
         * Constructor.
         *
         * @param declaringClass The class that declares this method.
         * @param f The field being wrapped.
         */
-       public FieldInfo(ClassInfo declaringClass, Field f) {
+       protected FieldInfo(ClassInfo declaringClass, Field f) {
                this.declaringClass = declaringClass;
                this.f = f;
        }
@@ -146,11 +150,8 @@ public final class FieldInfo implements 
Comparable<FieldInfo> {
                                        if (isTransient())
                                                return false;
                                        break;
-                               case ABSTRACT:
-                               case NOT_ABSTRACT:
                                default:
-                                       break;
-
+                                       throw new RuntimeException("Invalid 
flag for field: " + f);
                        }
                }
                return true;
@@ -197,13 +198,8 @@ public final class FieldInfo implements 
Comparable<FieldInfo> {
                                        if (isNotTransient())
                                                return true;
                                        break;
-                               case HAS_ARGS:
-                               case HAS_NO_ARGS:
-                               case ABSTRACT:
-                               case NOT_ABSTRACT:
                                default:
-                                       break;
-
+                                       throw new RuntimeException("Invalid 
flag for field: " + f);
                        }
                }
                return false;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflection/MethodInfo.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflection/MethodInfo.java
index cdc084c..6f2586e 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflection/MethodInfo.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflection/MethodInfo.java
@@ -38,12 +38,16 @@ public final class MethodInfo implements 
Comparable<MethodInfo> {
        private ClassInfo[] exceptionInfos;
        private String signature;
 
+       
//-----------------------------------------------------------------------------------------------------------------
+       // Instantiation.
+       
//-----------------------------------------------------------------------------------------------------------------
+
        /**
         * Constructor.
         *
         * @param m The method being wrapped.
         */
-       public MethodInfo(Method m) {
+       protected MethodInfo(Method m) {
                this(null, m);
        }
 
@@ -53,7 +57,7 @@ public final class MethodInfo implements 
Comparable<MethodInfo> {
         * @param declaringClass The class that declares this method.
         * @param m The method being wrapped.
         */
-       public MethodInfo(ClassInfo declaringClass, Method m) {
+       protected MethodInfo(ClassInfo declaringClass, Method m) {
                this.declaringClass = declaringClass;
                this.m = m;
        }
@@ -103,6 +107,11 @@ public final class MethodInfo implements 
Comparable<MethodInfo> {
                return declaringClass;
        }
 
+       
//-----------------------------------------------------------------------------------------------------------------
+       // Parent classes and interfaces.
+       
//-----------------------------------------------------------------------------------------------------------------
+
+
        /**
         * Returns the parameters defined on this method.
         *
@@ -357,11 +366,8 @@ public final class MethodInfo implements 
Comparable<MethodInfo> {
                                        if (isAbstract())
                                                return false;
                                        break;
-                               case TRANSIENT:
-                               case NOT_TRANSIENT:
                                default:
-                                       break;
-
+                                       throw new RuntimeException("Invalid 
flag for method: " + f);
                        }
                }
                return true;
@@ -416,11 +422,8 @@ public final class MethodInfo implements 
Comparable<MethodInfo> {
                                        if (isNotAbstract())
                                                return true;
                                        break;
-                               case TRANSIENT:
-                               case NOT_TRANSIENT:
                                default:
-                                       break;
-
+                                       throw new RuntimeException("Invalid 
flag for method: " + f);
                        }
                }
                return false;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflection/MethodParamInfo.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflection/MethodParamInfo.java
index 082fe19..7393fdd 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflection/MethodParamInfo.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflection/MethodParamInfo.java
@@ -33,6 +33,10 @@ public final class MethodParamInfo {
        private int index;
        private Map<Class<?>,Optional<Annotation>> annotationMap = new 
ConcurrentHashMap<>();
 
+       
//-----------------------------------------------------------------------------------------------------------------
+       // Instantiation.
+       
//-----------------------------------------------------------------------------------------------------------------
+
        /**
         * Constructor.
         *
@@ -92,16 +96,16 @@ public final class MethodParamInfo {
         * @return The class type of this parameter.
         */
        public Class<?> getParameterType() {
-               return isConstructor ? constructorInfo.getParameterType(index) 
: methodInfo.getParameterType(index);
+               return isConstructor ? 
constructorInfo.getParameterType(index).inner() : 
methodInfo.getParameterType(index);
        }
 
        /**
         * Returns the generic class type of this parameter.
         *
-        * @return The generic class type of htis parameter.
+        * @return The generic class type of this parameter.
         */
        public Type getGenericParameterType() {
-               return isConstructor ? 
constructorInfo.getGenericParameterType(index) : 
methodInfo.getGenericParameterType(index);
+               return isConstructor ? 
constructorInfo.getParameterType(index).innerType() : 
methodInfo.getGenericParameterType(index);
        }
 
        /**
@@ -110,7 +114,7 @@ public final class MethodParamInfo {
         * @return The generic class type of this parameter.
         */
        public ClassInfo getGenericParameterTypeInfo() {
-               return isConstructor ? 
constructorInfo.getGenericParameterTypeInfo(index) : 
methodInfo.getGenericParameterTypeInfo(index);
+               return isConstructor ? constructorInfo.getParameterType(index) 
: methodInfo.getGenericParameterTypeInfo(index);
        }
 
        /**
@@ -166,7 +170,7 @@ public final class MethodParamInfo {
                        for (Annotation a2 : 
constructorInfo.getParameterAnnotations(index))
                                if (a.isInstance(a2))
                                        return (T)a2;
-                       return 
constructorInfo.getGenericParameterTypeInfo(index).resolved().getAnnotation(a);
+                       return 
constructorInfo.getParameterType(index).resolved().getAnnotation(a);
                }
                for (Method m2 : methodInfo.getMatching())
                        for (Annotation a2 :  
m2.getParameterAnnotations()[index])
@@ -231,7 +235,7 @@ public final class MethodParamInfo {
        @SuppressWarnings("unchecked")
        public <T extends Annotation> List<T> appendAnnotations(List<T> l, 
Class<T> a, boolean parentFirst) {
                if (isConstructor) {
-                       ClassInfo ci = 
constructorInfo.getGenericParameterTypeInfo(index).resolved();
+                       ClassInfo ci = 
constructorInfo.getParameterType(index).resolved();
                        Annotation[] annotations = 
constructorInfo.getParameterAnnotations(index);
                        if (parentFirst) {
                                ci.appendAnnotationsParentFirst(l, a);
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/BuilderSwap.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/BuilderSwap.java
index 54319fc..8fd3184 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/BuilderSwap.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/BuilderSwap.java
@@ -15,6 +15,7 @@ package org.apache.juneau.transform;
 import static org.apache.juneau.internal.ClassUtils.*;
 
 import java.lang.reflect.*;
+import java.util.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
@@ -198,10 +199,10 @@ public class BuilderSwap<T,B> {
                if (builderClass == null) {
                        for (ConstructorInfo cc : pci.getPublicConstructors()) {
                                if (cc.isVisible(cVis) && cc.hasNumArgs(1)) {
-                                       Class<?>[] pt = cc.getParameterTypes();
-                                       if 
(getClassInfo(pt[0]).isChildOf(Builder.class)) {
+                                       List<ClassInfo> pt = 
cc.getParameterTypes();
+                                       if (pt.get(0).isChildOf(Builder.class)) 
{
                                                pojoConstructor = cc;
-                                               builderClass = pt[0];
+                                               builderClass = 
pt.get(0).inner();
                                        }
                                }
                        }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/SurrogateSwap.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/SurrogateSwap.java
index bc95665..ac5bb3a 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/SurrogateSwap.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/SurrogateSwap.java
@@ -62,16 +62,16 @@ public class SurrogateSwap<T,F> extends PojoSwap<T,F> {
                List<SurrogateSwap<?,?>> l = new LinkedList<>();
                ClassInfo ci = getClassInfo(c);
                for (ConstructorInfo cc : ci.getPublicConstructors()) {
-                       Class<?>[] pt = cc.getParameterTypes();
-                       if (cc.getAnnotation(BeanIgnore.class) == null && 
cc.hasNumArgs(1) && cc.isPublic() && pt[0] != c.getDeclaringClass()) {
+                       List<ClassInfo> pt = cc.getParameterTypes();
+                       if (cc.getAnnotation(BeanIgnore.class) == null && 
cc.hasNumArgs(1) && cc.isPublic() && ! pt.get(0).is(c.getDeclaringClass())) {
                                // Find the unswap method if there is one.
                                Method unswapMethod = null;
                                for (MethodInfo m : ci.getPublicMethods()) {
-                                       if (m.getReturnType().is(pt[0]) && 
m.isPublic())
+                                       if (m.getReturnType().is(pt.get(0)) && 
m.isPublic())
                                        unswapMethod = m.inner();
                                }
 
-                               l.add(new SurrogateSwap(pt[0], cc.inner(), 
unswapMethod));
+                               l.add(new SurrogateSwap(pt.get(0).inner(), 
cc.inner(), unswapMethod));
                        }
                }
                return l;

Reply via email to