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;