You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juneau.apache.org by ja...@apache.org on 2017/09/10 20:32:25 UTC

[13/34] incubator-juneau-website git commit: Update javadocs

http://git-wip-us.apache.org/repos/asf/incubator-juneau-website/blob/62afb533/content/site/apidocs/src-html/org/apache/juneau/internal/ClassUtils.ClassComparator.html
----------------------------------------------------------------------
diff --git a/content/site/apidocs/src-html/org/apache/juneau/internal/ClassUtils.ClassComparator.html b/content/site/apidocs/src-html/org/apache/juneau/internal/ClassUtils.ClassComparator.html
index 6cbb889..57fc64b 100644
--- a/content/site/apidocs/src-html/org/apache/juneau/internal/ClassUtils.ClassComparator.html
+++ b/content/site/apidocs/src-html/org/apache/juneau/internal/ClassUtils.ClassComparator.html
@@ -464,656 +464,662 @@
 <span class="sourceLineNo">456</span>         oc = oc.getSuperclass();<a name="line.456"></a>
 <span class="sourceLineNo">457</span>      }<a name="line.457"></a>
 <span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>      ParameterizedType opt = (ParameterizedType)oc.getGenericSuperclass();<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      Type actualType = opt.getActualTypeArguments()[index];<a name="line.460"></a>
-<span class="sourceLineNo">461</span><a name="line.461"></a>
-<span class="sourceLineNo">462</span>      if (typeMap.containsKey(actualType))<a name="line.462"></a>
-<span class="sourceLineNo">463</span>         actualType = typeMap.get(actualType);<a name="line.463"></a>
+<span class="sourceLineNo">459</span>      Type gsc = oc.getGenericSuperclass();<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      <a name="line.460"></a>
+<span class="sourceLineNo">461</span>      // Not actually a parameterized type.<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      if (! (gsc instanceof ParameterizedType))<a name="line.462"></a>
+<span class="sourceLineNo">463</span>         return Object.class;<a name="line.463"></a>
 <span class="sourceLineNo">464</span><a name="line.464"></a>
-<span class="sourceLineNo">465</span>      if (actualType instanceof Class) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>         return (Class&lt;?&gt;)actualType;<a name="line.466"></a>
+<span class="sourceLineNo">465</span>      ParameterizedType opt = (ParameterizedType)gsc;<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      Type actualType = opt.getActualTypeArguments()[index];<a name="line.466"></a>
 <span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>      } else if (actualType instanceof GenericArrayType) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>         Class&lt;?&gt; cmpntType = (Class&lt;?&gt;)((GenericArrayType)actualType).getGenericComponentType();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>         return Array.newInstance(cmpntType, 0).getClass();<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>      } else if (actualType instanceof TypeVariable) {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>         TypeVariable&lt;?&gt; typeVariable = (TypeVariable&lt;?&gt;)actualType;<a name="line.473"></a>
-<span class="sourceLineNo">474</span>         List&lt;Class&lt;?&gt;&gt; nestedOuterTypes = new LinkedList&lt;Class&lt;?&gt;&gt;();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>         for (Class&lt;?&gt; ec = oc.getEnclosingClass(); ec != null; ec = ec.getEnclosingClass()) {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>            try {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>               Class&lt;?&gt; outerClass = oc.getClass();<a name="line.477"></a>
-<span class="sourceLineNo">478</span>               nestedOuterTypes.add(outerClass);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>               Map&lt;Type,Type&gt; outerTypeMap = new HashMap&lt;Type,Type&gt;();<a name="line.479"></a>
-<span class="sourceLineNo">480</span>               extractTypes(outerTypeMap, outerClass);<a name="line.480"></a>
-<span class="sourceLineNo">481</span>               for (Map.Entry&lt;Type,Type&gt; entry : outerTypeMap.entrySet()) {<a name="line.481"></a>
-<span class="sourceLineNo">482</span>                  Type key = entry.getKey(), value = entry.getValue();<a name="line.482"></a>
-<span class="sourceLineNo">483</span>                  if (key instanceof TypeVariable) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>                     TypeVariable&lt;?&gt; keyType = (TypeVariable&lt;?&gt;)key;<a name="line.484"></a>
-<span class="sourceLineNo">485</span>                     if (keyType.getName().equals(typeVariable.getName()) &amp;&amp; isInnerClass(keyType.getGenericDeclaration(), typeVariable.getGenericDeclaration())) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>                        if (value instanceof Class)<a name="line.486"></a>
-<span class="sourceLineNo">487</span>                           return (Class&lt;?&gt;)value;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>                        typeVariable = (TypeVariable&lt;?&gt;)entry.getValue();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>                     }<a name="line.489"></a>
-<span class="sourceLineNo">490</span>                  }<a name="line.490"></a>
-<span class="sourceLineNo">491</span>               }<a name="line.491"></a>
-<span class="sourceLineNo">492</span>            } catch (Exception e) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>               throw new RuntimeException(e);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>            }<a name="line.494"></a>
-<span class="sourceLineNo">495</span>         }<a name="line.495"></a>
-<span class="sourceLineNo">496</span>         throw new FormattedRuntimeException("Could not resolve type: {0}", actualType);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      } else {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>         throw new FormattedRuntimeException("Invalid type found in resolveParameterType: {0}", actualType);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   }<a name="line.500"></a>
-<span class="sourceLineNo">501</span><a name="line.501"></a>
-<span class="sourceLineNo">502</span>   private static boolean isInnerClass(GenericDeclaration od, GenericDeclaration id) {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      if (od instanceof Class &amp;&amp; id instanceof Class) {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>         Class&lt;?&gt; oc = (Class&lt;?&gt;)od;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>         Class&lt;?&gt; ic = (Class&lt;?&gt;)id;<a name="line.505"></a>
-<span class="sourceLineNo">506</span>         while ((ic = ic.getEnclosingClass()) != null)<a name="line.506"></a>
-<span class="sourceLineNo">507</span>            if (ic == oc)<a name="line.507"></a>
-<span class="sourceLineNo">508</span>               return true;<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      }<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      return false;<a name="line.510"></a>
-<span class="sourceLineNo">511</span>   }<a name="line.511"></a>
-<span class="sourceLineNo">512</span><a name="line.512"></a>
-<span class="sourceLineNo">513</span>   private static void extractTypes(Map&lt;Type,Type&gt; typeMap, Class&lt;?&gt; c) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      Type gs = c.getGenericSuperclass();<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      if (gs instanceof ParameterizedType) {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>         ParameterizedType pt = (ParameterizedType)gs;<a name="line.516"></a>
-<span class="sourceLineNo">517</span>         Type[] typeParameters = ((Class&lt;?&gt;)pt.getRawType()).getTypeParameters();<a name="line.517"></a>
-<span class="sourceLineNo">518</span>         Type[] actualTypeArguments = pt.getActualTypeArguments();<a name="line.518"></a>
-<span class="sourceLineNo">519</span>         for (int i = 0; i &lt; typeParameters.length; i++) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>            if (typeMap.containsKey(actualTypeArguments[i]))<a name="line.520"></a>
-<span class="sourceLineNo">521</span>               actualTypeArguments[i] = typeMap.get(actualTypeArguments[i]);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>            typeMap.put(typeParameters[i], actualTypeArguments[i]);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>         }<a name="line.523"></a>
-<span class="sourceLineNo">524</span>      }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>   }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>   /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    * Finds a public method with the specified parameters.<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    *<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    * @param c The class to look for the method.<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    * @param name The method name.<a name="line.531"></a>
-<span class="sourceLineNo">532</span>    * @param returnType<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    *    The return type of the method.<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    *    Can be a super type of the actual return type.<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    *    For example, if the actual return type is &lt;code&gt;CharSequence&lt;/code&gt;, then &lt;code&gt;Object&lt;/code&gt; will match but<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    *    &lt;code&gt;String&lt;/code&gt; will not.<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    * @param parameterTypes<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    *    The parameter types of the method.<a name="line.538"></a>
-<span class="sourceLineNo">539</span>    *    Can be subtypes of the actual parameter types.<a name="line.539"></a>
-<span class="sourceLineNo">540</span>    *    For example, if the parameter type is &lt;code&gt;CharSequence&lt;/code&gt;, then &lt;code&gt;String&lt;/code&gt; will match but<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    *    &lt;code&gt;Object&lt;/code&gt; will not.<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    * @return The matched method, or &lt;jk&gt;null&lt;/jk&gt; if no match was found.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    */<a name="line.543"></a>
-<span class="sourceLineNo">544</span>   public static Method findPublicMethod(Class&lt;?&gt; c, String name, Class&lt;?&gt; returnType, Class&lt;?&gt;...parameterTypes) {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      for (Method m : c.getMethods()) {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>         if (isPublic(m) &amp;&amp; m.getName().equals(name)) {<a name="line.546"></a>
-<span class="sourceLineNo">547</span>            Class&lt;?&gt; rt = m.getReturnType();<a name="line.547"></a>
-<span class="sourceLineNo">548</span>            if (isParentClass(returnType, rt)) {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>               Class&lt;?&gt;[] pt = m.getParameterTypes();<a name="line.549"></a>
-<span class="sourceLineNo">550</span>               if (pt.length == parameterTypes.length) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>                  boolean matches = true;<a name="line.551"></a>
-<span class="sourceLineNo">552</span>                  for (int i = 0; i &lt; pt.length; i++) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>                     if (! isParentClass(pt[i], parameterTypes[i])) {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>                        matches = false;<a name="line.554"></a>
-<span class="sourceLineNo">555</span>                        break;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>                     }<a name="line.556"></a>
-<span class="sourceLineNo">557</span>                  }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>                  if (matches)<a name="line.558"></a>
-<span class="sourceLineNo">559</span>                     return m;<a name="line.559"></a>
-<span class="sourceLineNo">560</span>               }<a name="line.560"></a>
-<span class="sourceLineNo">561</span>            }<a name="line.561"></a>
-<span class="sourceLineNo">562</span>         }<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      }<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      return null;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>   }<a name="line.565"></a>
-<span class="sourceLineNo">566</span><a name="line.566"></a>
-<span class="sourceLineNo">567</span>   /**<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    * Finds a public constructor with the specified parameters without throwing an exception.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    *<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    * @param c The class to search for a constructor.<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    * @param parameterTypes<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    *    The parameter types in the constructor.<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    *    Can be subtypes of the actual constructor argument types.<a name="line.573"></a>
-<span class="sourceLineNo">574</span>    * @return The matching constructor, or &lt;jk&gt;null&lt;/jk&gt; if constructor could not be found.<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    */<a name="line.575"></a>
-<span class="sourceLineNo">576</span>   @SuppressWarnings("unchecked")<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   public static &lt;T&gt; Constructor&lt;T&gt; findPublicConstructor(Class&lt;T&gt; c, Class&lt;?&gt;...parameterTypes) {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      for (Constructor&lt;?&gt; n : c.getConstructors()) {<a name="line.578"></a>
-<span class="sourceLineNo">579</span>         if (isPublic(n)) {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>            Class&lt;?&gt;[] pt = n.getParameterTypes();<a name="line.580"></a>
-<span class="sourceLineNo">581</span>            if (pt.length == parameterTypes.length) {<a name="line.581"></a>
-<span class="sourceLineNo">582</span>               boolean matches = true;<a name="line.582"></a>
-<span class="sourceLineNo">583</span>               for (int i = 0; i &lt; pt.length; i++) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>                  if (! isParentClass(pt[i], parameterTypes[i])) {<a name="line.584"></a>
-<span class="sourceLineNo">585</span>                     matches = false;<a name="line.585"></a>
-<span class="sourceLineNo">586</span>                     break;<a name="line.586"></a>
-<span class="sourceLineNo">587</span>                  }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>               }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>               if (matches)<a name="line.589"></a>
-<span class="sourceLineNo">590</span>                  return (Constructor&lt;T&gt;)n;<a name="line.590"></a>
-<span class="sourceLineNo">591</span>            }<a name="line.591"></a>
-<span class="sourceLineNo">592</span>         }<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      }<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      return null;<a name="line.594"></a>
-<span class="sourceLineNo">595</span>   }<a name="line.595"></a>
-<span class="sourceLineNo">596</span><a name="line.596"></a>
-<span class="sourceLineNo">597</span>   /**<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    * Finds the public constructor that can take in the specified arguments.<a name="line.598"></a>
-<span class="sourceLineNo">599</span>    *<a name="line.599"></a>
-<span class="sourceLineNo">600</span>    * @param c The class we're trying to construct.<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    * @param args The arguments we want to pass into the constructor.<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    * @return<a name="line.602"></a>
-<span class="sourceLineNo">603</span>    *    The constructor, or &lt;jk&gt;null&lt;/jk&gt; if a public constructor could not be found that takes in the specified<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    *    arguments.<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    */<a name="line.605"></a>
-<span class="sourceLineNo">606</span>   public static &lt;T&gt; Constructor&lt;T&gt; findPublicConstructor(Class&lt;T&gt; c, Object...args) {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return findPublicConstructor(c, getClasses(args));<a name="line.607"></a>
-<span class="sourceLineNo">608</span>   }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>   /**<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    * Returns the class types for the specified arguments.<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    *<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    * @param args The objects we're getting the classes of.<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    * @return The classes of the arguments.<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    */<a name="line.615"></a>
-<span class="sourceLineNo">616</span>   public static Class&lt;?&gt;[] getClasses(Object...args) {<a name="line.616"></a>
-<span class="sourceLineNo">617</span>      Class&lt;?&gt;[] pt = new Class&lt;?&gt;[args.length];<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      for (int i = 0; i &lt; args.length; i++)<a name="line.618"></a>
-<span class="sourceLineNo">619</span>         pt[i] = args[i] == null ? null : args[i].getClass();<a name="line.619"></a>
-<span class="sourceLineNo">620</span>      return pt;<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   }<a name="line.621"></a>
-<span class="sourceLineNo">622</span><a name="line.622"></a>
-<span class="sourceLineNo">623</span>// This code is inherently unsafe (but still potentially useful?)<a name="line.623"></a>
-<span class="sourceLineNo">624</span>//<a name="line.624"></a>
-<span class="sourceLineNo">625</span>// /**<a name="line.625"></a>
-<span class="sourceLineNo">626</span>//  * Converts class name strings to ClassMeta objects.<a name="line.626"></a>
-<span class="sourceLineNo">627</span>//  *<a name="line.627"></a>
-<span class="sourceLineNo">628</span>//  * &lt;h5 class='section'&gt;Example:&lt;/h5&gt;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>//  * &lt;ul&gt;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>//  *    &lt;li&gt;&lt;js&gt;"java.lang.String"&lt;/js&gt;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>//  *    &lt;li&gt;&lt;js&gt;"com.foo.sample.MyBean[]"&lt;/js&gt;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>//  *    &lt;li&gt;&lt;js&gt;"java.util.HashMap&lt;java.lang.String,java.lang.Integer&gt;"&lt;/js&gt;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>//  *    &lt;li&gt;&lt;js&gt;"[Ljava.lang.String;"&lt;/js&gt; (i.e. the value of &lt;code&gt;String[].&lt;jk&gt;class&lt;/jk&gt;.getName()&lt;/code&gt;)<a name="line.633"></a>
-<span class="sourceLineNo">634</span>//  * &lt;/ul&gt;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>//  *<a name="line.635"></a>
-<span class="sourceLineNo">636</span>//  * @param s The class name.<a name="line.636"></a>
-<span class="sourceLineNo">637</span>//  * @return The ClassMeta corresponding to the class name string.<a name="line.637"></a>
-<span class="sourceLineNo">638</span>//  */<a name="line.638"></a>
-<span class="sourceLineNo">639</span>// protected final ClassMeta&lt;?&gt; getClassMetaFromString(String s) {<a name="line.639"></a>
-<span class="sourceLineNo">640</span>//    int d = 0;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>//    if (s == null || s.isEmpty())<a name="line.641"></a>
-<span class="sourceLineNo">642</span>//       return null;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>//<a name="line.643"></a>
-<span class="sourceLineNo">644</span>//    // Check for Class.getName() on array class types.<a name="line.644"></a>
-<span class="sourceLineNo">645</span>//    if (s.charAt(0) == '[') {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>//       try {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>//          return getClassMeta(findClass(s));<a name="line.647"></a>
-<span class="sourceLineNo">648</span>//       } catch (ClassNotFoundException e) {<a name="line.648"></a>
-<span class="sourceLineNo">649</span>//          throw new RuntimeException(e);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>//       }<a name="line.650"></a>
-<span class="sourceLineNo">651</span>//    }<a name="line.651"></a>
-<span class="sourceLineNo">652</span>//<a name="line.652"></a>
-<span class="sourceLineNo">653</span>//    int i1 = 0;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>//    int i2 = 0;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>//    int dim = 0;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>//    List&lt;ClassMeta&lt;?&gt;&gt; p = null;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>//    for (int i = 0; i &lt; s.length(); i++) {<a name="line.657"></a>
-<span class="sourceLineNo">658</span>//       char c = s.charAt(i);<a name="line.658"></a>
-<span class="sourceLineNo">659</span>//       if (c == '&lt;') {<a name="line.659"></a>
-<span class="sourceLineNo">660</span>//          if (d == 0) {<a name="line.660"></a>
-<span class="sourceLineNo">661</span>//             i1 = i;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>//             i2 = i+1;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>//             p = new LinkedList&lt;ClassMeta&lt;?&gt;&gt;();<a name="line.663"></a>
-<span class="sourceLineNo">664</span>//          }<a name="line.664"></a>
-<span class="sourceLineNo">665</span>//          d++;<a name="line.665"></a>
-<span class="sourceLineNo">666</span>//       } else if (c == '&gt;') {<a name="line.666"></a>
-<span class="sourceLineNo">667</span>//          d--;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>//          if (d == 0 &amp;&amp; p != null)<a name="line.668"></a>
-<span class="sourceLineNo">669</span>//             p.add(getClassMetaFromString(s.substring(i2, i)));<a name="line.669"></a>
-<span class="sourceLineNo">670</span>//       } else if (c == ',' &amp;&amp; d == 1) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>//          if (p != null)<a name="line.671"></a>
-<span class="sourceLineNo">672</span>//             p.add(getClassMetaFromString(s.substring(i2, i)));<a name="line.672"></a>
-<span class="sourceLineNo">673</span>//          i2 = i+1;<a name="line.673"></a>
-<span class="sourceLineNo">674</span>//       }<a name="line.674"></a>
-<span class="sourceLineNo">675</span>//       if (c == '[') {<a name="line.675"></a>
-<span class="sourceLineNo">676</span>//          if (i1 == 0)<a name="line.676"></a>
-<span class="sourceLineNo">677</span>//             i1 = i;<a name="line.677"></a>
-<span class="sourceLineNo">678</span>//          dim++;<a name="line.678"></a>
-<span class="sourceLineNo">679</span>//       }<a name="line.679"></a>
-<span class="sourceLineNo">680</span>//    }<a name="line.680"></a>
-<span class="sourceLineNo">681</span>//    if (i1 == 0)<a name="line.681"></a>
-<span class="sourceLineNo">682</span>//       i1 = s.length();<a name="line.682"></a>
-<span class="sourceLineNo">683</span>//    try {<a name="line.683"></a>
-<span class="sourceLineNo">684</span>//       String name = s.substring(0, i1).trim();<a name="line.684"></a>
-<span class="sourceLineNo">685</span>//       char x = name.charAt(0);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>//       Class&lt;?&gt; c = null;<a name="line.686"></a>
-<span class="sourceLineNo">687</span>//       if (x &gt;= 'b' &amp;&amp; x &lt;= 's') {<a name="line.687"></a>
-<span class="sourceLineNo">688</span>//          if (x == 'b' &amp;&amp; name.equals("boolean"))<a name="line.688"></a>
-<span class="sourceLineNo">689</span>//             c = boolean.class;<a name="line.689"></a>
-<span class="sourceLineNo">690</span>//          else if (x == 'b' &amp;&amp; name.equals("byte"))<a name="line.690"></a>
-<span class="sourceLineNo">691</span>//             c = byte.class;<a name="line.691"></a>
-<span class="sourceLineNo">692</span>//          else if (x == 'c' &amp;&amp; name.equals("char"))<a name="line.692"></a>
-<span class="sourceLineNo">693</span>//             c = char.class;<a name="line.693"></a>
-<span class="sourceLineNo">694</span>//          else if (x == 'd' &amp;&amp; name.equals("double"))<a name="line.694"></a>
-<span class="sourceLineNo">695</span>//             c = double.class;<a name="line.695"></a>
-<span class="sourceLineNo">696</span>//          else if (x == 'i' &amp;&amp; name.equals("int"))<a name="line.696"></a>
-<span class="sourceLineNo">697</span>//             c = int.class;<a name="line.697"></a>
-<span class="sourceLineNo">698</span>//          else if (x == 'l' &amp;&amp; name.equals("long"))<a name="line.698"></a>
-<span class="sourceLineNo">699</span>//             c = long.class;<a name="line.699"></a>
-<span class="sourceLineNo">700</span>//          else if (x == 's' &amp;&amp; name.equals("short"))<a name="line.700"></a>
-<span class="sourceLineNo">701</span>//             c = short.class;<a name="line.701"></a>
-<span class="sourceLineNo">702</span>//          else<a name="line.702"></a>
-<span class="sourceLineNo">703</span>//             c = findClass(name);<a name="line.703"></a>
-<span class="sourceLineNo">704</span>//       } else {<a name="line.704"></a>
-<span class="sourceLineNo">705</span>//          c = findClass(name);<a name="line.705"></a>
-<span class="sourceLineNo">706</span>//       }<a name="line.706"></a>
-<span class="sourceLineNo">707</span>//<a name="line.707"></a>
-<span class="sourceLineNo">708</span>//       ClassMeta&lt;?&gt; cm = getClassMeta(c);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>//<a name="line.709"></a>
-<span class="sourceLineNo">710</span>//       if (p != null) {<a name="line.710"></a>
-<span class="sourceLineNo">711</span>//          if (cm.isMap())<a name="line.711"></a>
-<span class="sourceLineNo">712</span>//             cm = new ClassMeta(c, this).setKeyType(p.get(0)).setValueType(p.get(1));<a name="line.712"></a>
-<span class="sourceLineNo">713</span>//          if (cm.isCollection())<a name="line.713"></a>
-<span class="sourceLineNo">714</span>//             cm = new ClassMeta(c, this).setElementType(p.get(0));<a name="line.714"></a>
-<span class="sourceLineNo">715</span>//       }<a name="line.715"></a>
-<span class="sourceLineNo">716</span>//<a name="line.716"></a>
-<span class="sourceLineNo">717</span>//       while (dim &gt; 0) {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>//          cm = new ClassMeta(Array.newInstance(cm.getInnerClass(), 0).getClass(), this);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>//          dim--;<a name="line.719"></a>
-<span class="sourceLineNo">720</span>//       }<a name="line.720"></a>
-<span class="sourceLineNo">721</span>//<a name="line.721"></a>
-<span class="sourceLineNo">722</span>//       return cm;<a name="line.722"></a>
-<span class="sourceLineNo">723</span>//    } catch (ClassNotFoundException e) {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>//       throw new RuntimeException(e);<a name="line.724"></a>
-<span class="sourceLineNo">725</span>//    }<a name="line.725"></a>
-<span class="sourceLineNo">726</span>// }<a name="line.726"></a>
+<span class="sourceLineNo">468</span>      if (typeMap.containsKey(actualType))<a name="line.468"></a>
+<span class="sourceLineNo">469</span>         actualType = typeMap.get(actualType);<a name="line.469"></a>
+<span class="sourceLineNo">470</span><a name="line.470"></a>
+<span class="sourceLineNo">471</span>      if (actualType instanceof Class) {<a name="line.471"></a>
+<span class="sourceLineNo">472</span>         return (Class&lt;?&gt;)actualType;<a name="line.472"></a>
+<span class="sourceLineNo">473</span><a name="line.473"></a>
+<span class="sourceLineNo">474</span>      } else if (actualType instanceof GenericArrayType) {<a name="line.474"></a>
+<span class="sourceLineNo">475</span>         Class&lt;?&gt; cmpntType = (Class&lt;?&gt;)((GenericArrayType)actualType).getGenericComponentType();<a name="line.475"></a>
+<span class="sourceLineNo">476</span>         return Array.newInstance(cmpntType, 0).getClass();<a name="line.476"></a>
+<span class="sourceLineNo">477</span><a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } else if (actualType instanceof TypeVariable) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>         TypeVariable&lt;?&gt; typeVariable = (TypeVariable&lt;?&gt;)actualType;<a name="line.479"></a>
+<span class="sourceLineNo">480</span>         List&lt;Class&lt;?&gt;&gt; nestedOuterTypes = new LinkedList&lt;Class&lt;?&gt;&gt;();<a name="line.480"></a>
+<span class="sourceLineNo">481</span>         for (Class&lt;?&gt; ec = oc.getEnclosingClass(); ec != null; ec = ec.getEnclosingClass()) {<a name="line.481"></a>
+<span class="sourceLineNo">482</span>            try {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>               Class&lt;?&gt; outerClass = oc.getClass();<a name="line.483"></a>
+<span class="sourceLineNo">484</span>               nestedOuterTypes.add(outerClass);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>               Map&lt;Type,Type&gt; outerTypeMap = new HashMap&lt;Type,Type&gt;();<a name="line.485"></a>
+<span class="sourceLineNo">486</span>               extractTypes(outerTypeMap, outerClass);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>               for (Map.Entry&lt;Type,Type&gt; entry : outerTypeMap.entrySet()) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>                  Type key = entry.getKey(), value = entry.getValue();<a name="line.488"></a>
+<span class="sourceLineNo">489</span>                  if (key instanceof TypeVariable) {<a name="line.489"></a>
+<span class="sourceLineNo">490</span>                     TypeVariable&lt;?&gt; keyType = (TypeVariable&lt;?&gt;)key;<a name="line.490"></a>
+<span class="sourceLineNo">491</span>                     if (keyType.getName().equals(typeVariable.getName()) &amp;&amp; isInnerClass(keyType.getGenericDeclaration(), typeVariable.getGenericDeclaration())) {<a name="line.491"></a>
+<span class="sourceLineNo">492</span>                        if (value instanceof Class)<a name="line.492"></a>
+<span class="sourceLineNo">493</span>                           return (Class&lt;?&gt;)value;<a name="line.493"></a>
+<span class="sourceLineNo">494</span>                        typeVariable = (TypeVariable&lt;?&gt;)entry.getValue();<a name="line.494"></a>
+<span class="sourceLineNo">495</span>                     }<a name="line.495"></a>
+<span class="sourceLineNo">496</span>                  }<a name="line.496"></a>
+<span class="sourceLineNo">497</span>               }<a name="line.497"></a>
+<span class="sourceLineNo">498</span>            } catch (Exception e) {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>               throw new RuntimeException(e);<a name="line.499"></a>
+<span class="sourceLineNo">500</span>            }<a name="line.500"></a>
+<span class="sourceLineNo">501</span>         }<a name="line.501"></a>
+<span class="sourceLineNo">502</span>         throw new FormattedRuntimeException("Could not resolve type: {0}", actualType);<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      } else {<a name="line.503"></a>
+<span class="sourceLineNo">504</span>         throw new FormattedRuntimeException("Invalid type found in resolveParameterType: {0}", actualType);<a name="line.504"></a>
+<span class="sourceLineNo">505</span>      }<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   }<a name="line.506"></a>
+<span class="sourceLineNo">507</span><a name="line.507"></a>
+<span class="sourceLineNo">508</span>   private static boolean isInnerClass(GenericDeclaration od, GenericDeclaration id) {<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      if (od instanceof Class &amp;&amp; id instanceof Class) {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>         Class&lt;?&gt; oc = (Class&lt;?&gt;)od;<a name="line.510"></a>
+<span class="sourceLineNo">511</span>         Class&lt;?&gt; ic = (Class&lt;?&gt;)id;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>         while ((ic = ic.getEnclosingClass()) != null)<a name="line.512"></a>
+<span class="sourceLineNo">513</span>            if (ic == oc)<a name="line.513"></a>
+<span class="sourceLineNo">514</span>               return true;<a name="line.514"></a>
+<span class="sourceLineNo">515</span>      }<a name="line.515"></a>
+<span class="sourceLineNo">516</span>      return false;<a name="line.516"></a>
+<span class="sourceLineNo">517</span>   }<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>   private static void extractTypes(Map&lt;Type,Type&gt; typeMap, Class&lt;?&gt; c) {<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      Type gs = c.getGenericSuperclass();<a name="line.520"></a>
+<span class="sourceLineNo">521</span>      if (gs instanceof ParameterizedType) {<a name="line.521"></a>
+<span class="sourceLineNo">522</span>         ParameterizedType pt = (ParameterizedType)gs;<a name="line.522"></a>
+<span class="sourceLineNo">523</span>         Type[] typeParameters = ((Class&lt;?&gt;)pt.getRawType()).getTypeParameters();<a name="line.523"></a>
+<span class="sourceLineNo">524</span>         Type[] actualTypeArguments = pt.getActualTypeArguments();<a name="line.524"></a>
+<span class="sourceLineNo">525</span>         for (int i = 0; i &lt; typeParameters.length; i++) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>            if (typeMap.containsKey(actualTypeArguments[i]))<a name="line.526"></a>
+<span class="sourceLineNo">527</span>               actualTypeArguments[i] = typeMap.get(actualTypeArguments[i]);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>            typeMap.put(typeParameters[i], actualTypeArguments[i]);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>         }<a name="line.529"></a>
+<span class="sourceLineNo">530</span>      }<a name="line.530"></a>
+<span class="sourceLineNo">531</span>   }<a name="line.531"></a>
+<span class="sourceLineNo">532</span><a name="line.532"></a>
+<span class="sourceLineNo">533</span>   /**<a name="line.533"></a>
+<span class="sourceLineNo">534</span>    * Finds a public method with the specified parameters.<a name="line.534"></a>
+<span class="sourceLineNo">535</span>    *<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    * @param c The class to look for the method.<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    * @param name The method name.<a name="line.537"></a>
+<span class="sourceLineNo">538</span>    * @param returnType<a name="line.538"></a>
+<span class="sourceLineNo">539</span>    *    The return type of the method.<a name="line.539"></a>
+<span class="sourceLineNo">540</span>    *    Can be a super type of the actual return type.<a name="line.540"></a>
+<span class="sourceLineNo">541</span>    *    For example, if the actual return type is &lt;code&gt;CharSequence&lt;/code&gt;, then &lt;code&gt;Object&lt;/code&gt; will match but<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    *    &lt;code&gt;String&lt;/code&gt; will not.<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    * @param parameterTypes<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    *    The parameter types of the method.<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    *    Can be subtypes of the actual parameter types.<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    *    For example, if the parameter type is &lt;code&gt;CharSequence&lt;/code&gt;, then &lt;code&gt;String&lt;/code&gt; will match but<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    *    &lt;code&gt;Object&lt;/code&gt; will not.<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    * @return The matched method, or &lt;jk&gt;null&lt;/jk&gt; if no match was found.<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    */<a name="line.549"></a>
+<span class="sourceLineNo">550</span>   public static Method findPublicMethod(Class&lt;?&gt; c, String name, Class&lt;?&gt; returnType, Class&lt;?&gt;...parameterTypes) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      for (Method m : c.getMethods()) {<a name="line.551"></a>
+<span class="sourceLineNo">552</span>         if (isPublic(m) &amp;&amp; m.getName().equals(name)) {<a name="line.552"></a>
+<span class="sourceLineNo">553</span>            Class&lt;?&gt; rt = m.getReturnType();<a name="line.553"></a>
+<span class="sourceLineNo">554</span>            if (isParentClass(returnType, rt)) {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>               Class&lt;?&gt;[] pt = m.getParameterTypes();<a name="line.555"></a>
+<span class="sourceLineNo">556</span>               if (pt.length == parameterTypes.length) {<a name="line.556"></a>
+<span class="sourceLineNo">557</span>                  boolean matches = true;<a name="line.557"></a>
+<span class="sourceLineNo">558</span>                  for (int i = 0; i &lt; pt.length; i++) {<a name="line.558"></a>
+<span class="sourceLineNo">559</span>                     if (! isParentClass(pt[i], parameterTypes[i])) {<a name="line.559"></a>
+<span class="sourceLineNo">560</span>                        matches = false;<a name="line.560"></a>
+<span class="sourceLineNo">561</span>                        break;<a name="line.561"></a>
+<span class="sourceLineNo">562</span>                     }<a name="line.562"></a>
+<span class="sourceLineNo">563</span>                  }<a name="line.563"></a>
+<span class="sourceLineNo">564</span>                  if (matches)<a name="line.564"></a>
+<span class="sourceLineNo">565</span>                     return m;<a name="line.565"></a>
+<span class="sourceLineNo">566</span>               }<a name="line.566"></a>
+<span class="sourceLineNo">567</span>            }<a name="line.567"></a>
+<span class="sourceLineNo">568</span>         }<a name="line.568"></a>
+<span class="sourceLineNo">569</span>      }<a name="line.569"></a>
+<span class="sourceLineNo">570</span>      return null;<a name="line.570"></a>
+<span class="sourceLineNo">571</span>   }<a name="line.571"></a>
+<span class="sourceLineNo">572</span><a name="line.572"></a>
+<span class="sourceLineNo">573</span>   /**<a name="line.573"></a>
+<span class="sourceLineNo">574</span>    * Finds a public constructor with the specified parameters without throwing an exception.<a name="line.574"></a>
+<span class="sourceLineNo">575</span>    *<a name="line.575"></a>
+<span class="sourceLineNo">576</span>    * @param c The class to search for a constructor.<a name="line.576"></a>
+<span class="sourceLineNo">577</span>    * @param parameterTypes<a name="line.577"></a>
+<span class="sourceLineNo">578</span>    *    The parameter types in the constructor.<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    *    Can be subtypes of the actual constructor argument types.<a name="line.579"></a>
+<span class="sourceLineNo">580</span>    * @return The matching constructor, or &lt;jk&gt;null&lt;/jk&gt; if constructor could not be found.<a name="line.580"></a>
+<span class="sourceLineNo">581</span>    */<a name="line.581"></a>
+<span class="sourceLineNo">582</span>   @SuppressWarnings("unchecked")<a name="line.582"></a>
+<span class="sourceLineNo">583</span>   public static &lt;T&gt; Constructor&lt;T&gt; findPublicConstructor(Class&lt;T&gt; c, Class&lt;?&gt;...parameterTypes) {<a name="line.583"></a>
+<span class="sourceLineNo">584</span>      for (Constructor&lt;?&gt; n : c.getConstructors()) {<a name="line.584"></a>
+<span class="sourceLineNo">585</span>         if (isPublic(n)) {<a name="line.585"></a>
+<span class="sourceLineNo">586</span>            Class&lt;?&gt;[] pt = n.getParameterTypes();<a name="line.586"></a>
+<span class="sourceLineNo">587</span>            if (pt.length == parameterTypes.length) {<a name="line.587"></a>
+<span class="sourceLineNo">588</span>               boolean matches = true;<a name="line.588"></a>
+<span class="sourceLineNo">589</span>               for (int i = 0; i &lt; pt.length; i++) {<a name="line.589"></a>
+<span class="sourceLineNo">590</span>                  if (! isParentClass(pt[i], parameterTypes[i])) {<a name="line.590"></a>
+<span class="sourceLineNo">591</span>                     matches = false;<a name="line.591"></a>
+<span class="sourceLineNo">592</span>                     break;<a name="line.592"></a>
+<span class="sourceLineNo">593</span>                  }<a name="line.593"></a>
+<span class="sourceLineNo">594</span>               }<a name="line.594"></a>
+<span class="sourceLineNo">595</span>               if (matches)<a name="line.595"></a>
+<span class="sourceLineNo">596</span>                  return (Constructor&lt;T&gt;)n;<a name="line.596"></a>
+<span class="sourceLineNo">597</span>            }<a name="line.597"></a>
+<span class="sourceLineNo">598</span>         }<a name="line.598"></a>
+<span class="sourceLineNo">599</span>      }<a name="line.599"></a>
+<span class="sourceLineNo">600</span>      return null;<a name="line.600"></a>
+<span class="sourceLineNo">601</span>   }<a name="line.601"></a>
+<span class="sourceLineNo">602</span><a name="line.602"></a>
+<span class="sourceLineNo">603</span>   /**<a name="line.603"></a>
+<span class="sourceLineNo">604</span>    * Finds the public constructor that can take in the specified arguments.<a name="line.604"></a>
+<span class="sourceLineNo">605</span>    *<a name="line.605"></a>
+<span class="sourceLineNo">606</span>    * @param c The class we're trying to construct.<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    * @param args The arguments we want to pass into the constructor.<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    * @return<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    *    The constructor, or &lt;jk&gt;null&lt;/jk&gt; if a public constructor could not be found that takes in the specified<a name="line.609"></a>
+<span class="sourceLineNo">610</span>    *    arguments.<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    */<a name="line.611"></a>
+<span class="sourceLineNo">612</span>   public static &lt;T&gt; Constructor&lt;T&gt; findPublicConstructor(Class&lt;T&gt; c, Object...args) {<a name="line.612"></a>
+<span class="sourceLineNo">613</span>      return findPublicConstructor(c, getClasses(args));<a name="line.613"></a>
+<span class="sourceLineNo">614</span>   }<a name="line.614"></a>
+<span class="sourceLineNo">615</span><a name="line.615"></a>
+<span class="sourceLineNo">616</span>   /**<a name="line.616"></a>
+<span class="sourceLineNo">617</span>    * Returns the class types for the specified arguments.<a name="line.617"></a>
+<span class="sourceLineNo">618</span>    *<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    * @param args The objects we're getting the classes of.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    * @return The classes of the arguments.<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    */<a name="line.621"></a>
+<span class="sourceLineNo">622</span>   public static Class&lt;?&gt;[] getClasses(Object...args) {<a name="line.622"></a>
+<span class="sourceLineNo">623</span>      Class&lt;?&gt;[] pt = new Class&lt;?&gt;[args.length];<a name="line.623"></a>
+<span class="sourceLineNo">624</span>      for (int i = 0; i &lt; args.length; i++)<a name="line.624"></a>
+<span class="sourceLineNo">625</span>         pt[i] = args[i] == null ? null : args[i].getClass();<a name="line.625"></a>
+<span class="sourceLineNo">626</span>      return pt;<a name="line.626"></a>
+<span class="sourceLineNo">627</span>   }<a name="line.627"></a>
+<span class="sourceLineNo">628</span><a name="line.628"></a>
+<span class="sourceLineNo">629</span>// This code is inherently unsafe (but still potentially useful?)<a name="line.629"></a>
+<span class="sourceLineNo">630</span>//<a name="line.630"></a>
+<span class="sourceLineNo">631</span>// /**<a name="line.631"></a>
+<span class="sourceLineNo">632</span>//  * Converts class name strings to ClassMeta objects.<a name="line.632"></a>
+<span class="sourceLineNo">633</span>//  *<a name="line.633"></a>
+<span class="sourceLineNo">634</span>//  * &lt;h5 class='section'&gt;Example:&lt;/h5&gt;<a name="line.634"></a>
+<span class="sourceLineNo">635</span>//  * &lt;ul&gt;<a name="line.635"></a>
+<span class="sourceLineNo">636</span>//  *    &lt;li&gt;&lt;js&gt;"java.lang.String"&lt;/js&gt;<a name="line.636"></a>
+<span class="sourceLineNo">637</span>//  *    &lt;li&gt;&lt;js&gt;"com.foo.sample.MyBean[]"&lt;/js&gt;<a name="line.637"></a>
+<span class="sourceLineNo">638</span>//  *    &lt;li&gt;&lt;js&gt;"java.util.HashMap&lt;java.lang.String,java.lang.Integer&gt;"&lt;/js&gt;<a name="line.638"></a>
+<span class="sourceLineNo">639</span>//  *    &lt;li&gt;&lt;js&gt;"[Ljava.lang.String;"&lt;/js&gt; (i.e. the value of &lt;code&gt;String[].&lt;jk&gt;class&lt;/jk&gt;.getName()&lt;/code&gt;)<a name="line.639"></a>
+<span class="sourceLineNo">640</span>//  * &lt;/ul&gt;<a name="line.640"></a>
+<span class="sourceLineNo">641</span>//  *<a name="line.641"></a>
+<span class="sourceLineNo">642</span>//  * @param s The class name.<a name="line.642"></a>
+<span class="sourceLineNo">643</span>//  * @return The ClassMeta corresponding to the class name string.<a name="line.643"></a>
+<span class="sourceLineNo">644</span>//  */<a name="line.644"></a>
+<span class="sourceLineNo">645</span>// protected final ClassMeta&lt;?&gt; getClassMetaFromString(String s) {<a name="line.645"></a>
+<span class="sourceLineNo">646</span>//    int d = 0;<a name="line.646"></a>
+<span class="sourceLineNo">647</span>//    if (s == null || s.isEmpty())<a name="line.647"></a>
+<span class="sourceLineNo">648</span>//       return null;<a name="line.648"></a>
+<span class="sourceLineNo">649</span>//<a name="line.649"></a>
+<span class="sourceLineNo">650</span>//    // Check for Class.getName() on array class types.<a name="line.650"></a>
+<span class="sourceLineNo">651</span>//    if (s.charAt(0) == '[') {<a name="line.651"></a>
+<span class="sourceLineNo">652</span>//       try {<a name="line.652"></a>
+<span class="sourceLineNo">653</span>//          return getClassMeta(findClass(s));<a name="line.653"></a>
+<span class="sourceLineNo">654</span>//       } catch (ClassNotFoundException e) {<a name="line.654"></a>
+<span class="sourceLineNo">655</span>//          throw new RuntimeException(e);<a name="line.655"></a>
+<span class="sourceLineNo">656</span>//       }<a name="line.656"></a>
+<span class="sourceLineNo">657</span>//    }<a name="line.657"></a>
+<span class="sourceLineNo">658</span>//<a name="line.658"></a>
+<span class="sourceLineNo">659</span>//    int i1 = 0;<a name="line.659"></a>
+<span class="sourceLineNo">660</span>//    int i2 = 0;<a name="line.660"></a>
+<span class="sourceLineNo">661</span>//    int dim = 0;<a name="line.661"></a>
+<span class="sourceLineNo">662</span>//    List&lt;ClassMeta&lt;?&gt;&gt; p = null;<a name="line.662"></a>
+<span class="sourceLineNo">663</span>//    for (int i = 0; i &lt; s.length(); i++) {<a name="line.663"></a>
+<span class="sourceLineNo">664</span>//       char c = s.charAt(i);<a name="line.664"></a>
+<span class="sourceLineNo">665</span>//       if (c == '&lt;') {<a name="line.665"></a>
+<span class="sourceLineNo">666</span>//          if (d == 0) {<a name="line.666"></a>
+<span class="sourceLineNo">667</span>//             i1 = i;<a name="line.667"></a>
+<span class="sourceLineNo">668</span>//             i2 = i+1;<a name="line.668"></a>
+<span class="sourceLineNo">669</span>//             p = new LinkedList&lt;ClassMeta&lt;?&gt;&gt;();<a name="line.669"></a>
+<span class="sourceLineNo">670</span>//          }<a name="line.670"></a>
+<span class="sourceLineNo">671</span>//          d++;<a name="line.671"></a>
+<span class="sourceLineNo">672</span>//       } else if (c == '&gt;') {<a name="line.672"></a>
+<span class="sourceLineNo">673</span>//          d--;<a name="line.673"></a>
+<span class="sourceLineNo">674</span>//          if (d == 0 &amp;&amp; p != null)<a name="line.674"></a>
+<span class="sourceLineNo">675</span>//             p.add(getClassMetaFromString(s.substring(i2, i)));<a name="line.675"></a>
+<span class="sourceLineNo">676</span>//       } else if (c == ',' &amp;&amp; d == 1) {<a name="line.676"></a>
+<span class="sourceLineNo">677</span>//          if (p != null)<a name="line.677"></a>
+<span class="sourceLineNo">678</span>//             p.add(getClassMetaFromString(s.substring(i2, i)));<a name="line.678"></a>
+<span class="sourceLineNo">679</span>//          i2 = i+1;<a name="line.679"></a>
+<span class="sourceLineNo">680</span>//       }<a name="line.680"></a>
+<span class="sourceLineNo">681</span>//       if (c == '[') {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>//          if (i1 == 0)<a name="line.682"></a>
+<span class="sourceLineNo">683</span>//             i1 = i;<a name="line.683"></a>
+<span class="sourceLineNo">684</span>//          dim++;<a name="line.684"></a>
+<span class="sourceLineNo">685</span>//       }<a name="line.685"></a>
+<span class="sourceLineNo">686</span>//    }<a name="line.686"></a>
+<span class="sourceLineNo">687</span>//    if (i1 == 0)<a name="line.687"></a>
+<span class="sourceLineNo">688</span>//       i1 = s.length();<a name="line.688"></a>
+<span class="sourceLineNo">689</span>//    try {<a name="line.689"></a>
+<span class="sourceLineNo">690</span>//       String name = s.substring(0, i1).trim();<a name="line.690"></a>
+<span class="sourceLineNo">691</span>//       char x = name.charAt(0);<a name="line.691"></a>
+<span class="sourceLineNo">692</span>//       Class&lt;?&gt; c = null;<a name="line.692"></a>
+<span class="sourceLineNo">693</span>//       if (x &gt;= 'b' &amp;&amp; x &lt;= 's') {<a name="line.693"></a>
+<span class="sourceLineNo">694</span>//          if (x == 'b' &amp;&amp; name.equals("boolean"))<a name="line.694"></a>
+<span class="sourceLineNo">695</span>//             c = boolean.class;<a name="line.695"></a>
+<span class="sourceLineNo">696</span>//          else if (x == 'b' &amp;&amp; name.equals("byte"))<a name="line.696"></a>
+<span class="sourceLineNo">697</span>//             c = byte.class;<a name="line.697"></a>
+<span class="sourceLineNo">698</span>//          else if (x == 'c' &amp;&amp; name.equals("char"))<a name="line.698"></a>
+<span class="sourceLineNo">699</span>//             c = char.class;<a name="line.699"></a>
+<span class="sourceLineNo">700</span>//          else if (x == 'd' &amp;&amp; name.equals("double"))<a name="line.700"></a>
+<span class="sourceLineNo">701</span>//             c = double.class;<a name="line.701"></a>
+<span class="sourceLineNo">702</span>//          else if (x == 'i' &amp;&amp; name.equals("int"))<a name="line.702"></a>
+<span class="sourceLineNo">703</span>//             c = int.class;<a name="line.703"></a>
+<span class="sourceLineNo">704</span>//          else if (x == 'l' &amp;&amp; name.equals("long"))<a name="line.704"></a>
+<span class="sourceLineNo">705</span>//             c = long.class;<a name="line.705"></a>
+<span class="sourceLineNo">706</span>//          else if (x == 's' &amp;&amp; name.equals("short"))<a name="line.706"></a>
+<span class="sourceLineNo">707</span>//             c = short.class;<a name="line.707"></a>
+<span class="sourceLineNo">708</span>//          else<a name="line.708"></a>
+<span class="sourceLineNo">709</span>//             c = findClass(name);<a name="line.709"></a>
+<span class="sourceLineNo">710</span>//       } else {<a name="line.710"></a>
+<span class="sourceLineNo">711</span>//          c = findClass(name);<a name="line.711"></a>
+<span class="sourceLineNo">712</span>//       }<a name="line.712"></a>
+<span class="sourceLineNo">713</span>//<a name="line.713"></a>
+<span class="sourceLineNo">714</span>//       ClassMeta&lt;?&gt; cm = getClassMeta(c);<a name="line.714"></a>
+<span class="sourceLineNo">715</span>//<a name="line.715"></a>
+<span class="sourceLineNo">716</span>//       if (p != null) {<a name="line.716"></a>
+<span class="sourceLineNo">717</span>//          if (cm.isMap())<a name="line.717"></a>
+<span class="sourceLineNo">718</span>//             cm = new ClassMeta(c, this).setKeyType(p.get(0)).setValueType(p.get(1));<a name="line.718"></a>
+<span class="sourceLineNo">719</span>//          if (cm.isCollection())<a name="line.719"></a>
+<span class="sourceLineNo">720</span>//             cm = new ClassMeta(c, this).setElementType(p.get(0));<a name="line.720"></a>
+<span class="sourceLineNo">721</span>//       }<a name="line.721"></a>
+<span class="sourceLineNo">722</span>//<a name="line.722"></a>
+<span class="sourceLineNo">723</span>//       while (dim &gt; 0) {<a name="line.723"></a>
+<span class="sourceLineNo">724</span>//          cm = new ClassMeta(Array.newInstance(cm.getInnerClass(), 0).getClass(), this);<a name="line.724"></a>
+<span class="sourceLineNo">725</span>//          dim--;<a name="line.725"></a>
+<span class="sourceLineNo">726</span>//       }<a name="line.726"></a>
 <span class="sourceLineNo">727</span>//<a name="line.727"></a>
-<span class="sourceLineNo">728</span>// private Class&lt;?&gt; findClass(String name) throws ClassNotFoundException {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>//    return classLoader == null ? Class.forName(name) : Class.forName(name, true, classLoader);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>// }<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>   /**<a name="line.732"></a>
-<span class="sourceLineNo">733</span>    * Returns a {@link MethodInfo} bean that describes the specified method.<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    *<a name="line.734"></a>
-<span class="sourceLineNo">735</span>    * @param m The method to describe.<a name="line.735"></a>
-<span class="sourceLineNo">736</span>    * @return The bean with information about the method.<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    */<a name="line.737"></a>
-<span class="sourceLineNo">738</span>   public static MethodInfo getMethodInfo(Method m) {<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      return new MethodInfo(m);<a name="line.739"></a>
-<span class="sourceLineNo">740</span>   }<a name="line.740"></a>
-<span class="sourceLineNo">741</span><a name="line.741"></a>
-<span class="sourceLineNo">742</span>   /**<a name="line.742"></a>
-<span class="sourceLineNo">743</span>    * Returns {@link MethodInfo} beans that describe the specified methods.<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    *<a name="line.744"></a>
-<span class="sourceLineNo">745</span>    * @param m The methods to describe.<a name="line.745"></a>
-<span class="sourceLineNo">746</span>    * @return The beans with information about the methods.<a name="line.746"></a>
-<span class="sourceLineNo">747</span>    */<a name="line.747"></a>
-<span class="sourceLineNo">748</span>   public static MethodInfo[] getMethodInfo(Collection&lt;Method&gt; m) {<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      MethodInfo[] mi = new MethodInfo[m.size()];<a name="line.749"></a>
-<span class="sourceLineNo">750</span>      int i = 0;<a name="line.750"></a>
-<span class="sourceLineNo">751</span>      for (Method mm : m)<a name="line.751"></a>
-<span class="sourceLineNo">752</span>         mi[i++] = getMethodInfo(mm);<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      return mi;<a name="line.753"></a>
-<span class="sourceLineNo">754</span>   }<a name="line.754"></a>
-<span class="sourceLineNo">755</span><a name="line.755"></a>
-<span class="sourceLineNo">756</span>   /**<a name="line.756"></a>
-<span class="sourceLineNo">757</span>    * Simple bean that shows the name, parameter types, and return type of a method.<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    */<a name="line.758"></a>
-<span class="sourceLineNo">759</span>   @SuppressWarnings("javadoc")<a name="line.759"></a>
-<span class="sourceLineNo">760</span>   public static class MethodInfo {<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      public final String methodName;<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      public final String[] parameterTypes;<a name="line.762"></a>
-<span class="sourceLineNo">763</span>      public final String returnType;<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>      MethodInfo(Method m) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>         methodName = m.getName();<a name="line.766"></a>
-<span class="sourceLineNo">767</span>         Type[] pt = m.getGenericParameterTypes();<a name="line.767"></a>
-<span class="sourceLineNo">768</span>         parameterTypes = new String[pt.length];<a name="line.768"></a>
-<span class="sourceLineNo">769</span>         for (int i  = 0; i &lt; pt.length; i++)<a name="line.769"></a>
-<span class="sourceLineNo">770</span>            parameterTypes[i] = BeanContext.DEFAULT.getClassMeta(pt[i]).toString();<a name="line.770"></a>
-<span class="sourceLineNo">771</span>         returnType = BeanContext.DEFAULT.getClassMeta(m.getGenericReturnType()).toString();<a name="line.771"></a>
-<span class="sourceLineNo">772</span>      }<a name="line.772"></a>
-<span class="sourceLineNo">773</span>   }<a name="line.773"></a>
-<span class="sourceLineNo">774</span><a name="line.774"></a>
-<span class="sourceLineNo">775</span>   /**<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    * Creates an instance of the specified class without throwing exceptions.<a name="line.776"></a>
-<span class="sourceLineNo">777</span>    *<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    * @param c The class to cast to.<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    * @param c2<a name="line.779"></a>
-<span class="sourceLineNo">780</span>    *    The class to instantiate.<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    *    Can also be an instance of the class.<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    * @param args The arguments to pass to the constructor.<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    * @return The new class instance, or &lt;jk&gt;null&lt;/jk&gt; if the class was &lt;jk&gt;null&lt;/jk&gt; or is abstract or an interface.<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    * @throws RuntimeException if constructor could not be found or called.<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    */<a name="line.785"></a>
-<span class="sourceLineNo">786</span>   public static &lt;T&gt; T newInstance(Class&lt;T&gt; c, Object c2, Object...args) {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      return newInstanceFromOuter(null, c, c2, args);<a name="line.787"></a>
-<span class="sourceLineNo">788</span>   }<a name="line.788"></a>
-<span class="sourceLineNo">789</span><a name="line.789"></a>
-<span class="sourceLineNo">790</span>   /**<a name="line.790"></a>
-<span class="sourceLineNo">791</span>    * Creates an instance of the specified class from within the context of another object.<a name="line.791"></a>
-<span class="sourceLineNo">792</span>    *<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    * @param outer<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    *    The outer object.<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    *    Can be &lt;jk&gt;null&lt;/jk&gt;.<a name="line.795"></a>
-<span class="sourceLineNo">796</span>    * @param c The class to cast to.<a name="line.796"></a>
-<span class="sourceLineNo">797</span>    * @param c2<a name="line.797"></a>
-<span class="sourceLineNo">798</span>    *    The class to instantiate.<a name="line.798"></a>
-<span class="sourceLineNo">799</span>    *    Can also be an instance of the class.<a name="line.799"></a>
-<span class="sourceLineNo">800</span>    * @param args The arguments to pass to the constructor.<a name="line.800"></a>
-<span class="sourceLineNo">801</span>    * @return The new class instance, or &lt;jk&gt;null&lt;/jk&gt; if the class was &lt;jk&gt;null&lt;/jk&gt; or is abstract or an interface.<a name="line.801"></a>
-<span class="sourceLineNo">802</span>    * @throws RuntimeException if constructor could not be found or called.<a name="line.802"></a>
-<span class="sourceLineNo">803</span>    */<a name="line.803"></a>
-<span class="sourceLineNo">804</span>   @SuppressWarnings("unchecked")<a name="line.804"></a>
-<span class="sourceLineNo">805</span>   public static &lt;T&gt; T newInstanceFromOuter(Object outer, Class&lt;T&gt; c, Object c2, Object...args) {<a name="line.805"></a>
-<span class="sourceLineNo">806</span>      if (c2 == null)<a name="line.806"></a>
-<span class="sourceLineNo">807</span>         return null;<a name="line.807"></a>
-<span class="sourceLineNo">808</span>      if (c2 instanceof Class) {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>         try {<a name="line.809"></a>
-<span class="sourceLineNo">810</span>            Class&lt;?&gt; c3 = (Class&lt;?&gt;)c2;<a name="line.810"></a>
-<span class="sourceLineNo">811</span>            if (c3.isInterface() || isAbstract(c3))<a name="line.811"></a>
-<span class="sourceLineNo">812</span>               return null;<a name="line.812"></a>
-<span class="sourceLineNo">813</span>            Constructor&lt;?&gt; con = findPublicConstructor(c3, args);<a name="line.813"></a>
-<span class="sourceLineNo">814</span>            if (con != null)<a name="line.814"></a>
-<span class="sourceLineNo">815</span>               return (T)con.newInstance(args);<a name="line.815"></a>
-<span class="sourceLineNo">816</span>            if (outer != null) {<a name="line.816"></a>
-<span class="sourceLineNo">817</span>               Object[] args2 = new AList&lt;Object&gt;().append(outer).appendAll(args).toArray();<a name="line.817"></a>
-<span class="sourceLineNo">818</span>               con = findPublicConstructor(c3, args2);<a name="line.818"></a>
-<span class="sourceLineNo">819</span>               if (con != null)<a name="line.819"></a>
-<span class="sourceLineNo">820</span>                  return (T)con.newInstance(args2);<a name="line.820"></a>
-<span class="sourceLineNo">821</span>            }<a name="line.821"></a>
-<span class="sourceLineNo">822</span>            return (T)c3.getConstructor(getClasses(args)).newInstance(args);<a name="line.822"></a>
-<span class="sourceLineNo">823</span>         } catch (Exception e) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>            throw new FormattedRuntimeException(e, "Could not instantiate class {0}", c.getName());<a name="line.824"></a>
-<span class="sourceLineNo">825</span>         }<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      } else if (isParentClass(c, c2.getClass())) {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>         return (T)c2;<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      } else {<a name="line.828"></a>
-<span class="sourceLineNo">829</span>         throw new FormattedRuntimeException("Object of type {0} found but was expecting {1}.", c2.getClass(), c.getClass());<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      }<a name="line.830"></a>
-<span class="sourceLineNo">831</span>   }<a name="line.831"></a>
-<span class="sourceLineNo">832</span><a name="line.832"></a>
-<span class="sourceLineNo">833</span>   /**<a name="line.833"></a>
-<span class="sourceLineNo">834</span>    * Returns all the fields in the specified class and all parent classes.<a name="line.834"></a>
-<span class="sourceLineNo">835</span>    *<a name="line.835"></a>
-<span class="sourceLineNo">836</span>    * &lt;p&gt;<a name="line.836"></a>
-<span class="sourceLineNo">837</span>    * Fields are ordered in either parent-to-child, or child-to-parent order, then alphabetically.<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    *<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    * @param c The class to get all fields on.<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    * @param parentFirst Order them in parent-class-to-child-class order, otherwise child-class-to-parent-class order.<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    * @return An iterable of all fields in the specified class.<a name="line.841"></a>
-<span class="sourceLineNo">842</span>    */<a name="line.842"></a>
-<span class="sourceLineNo">843</span>   @SuppressWarnings("rawtypes")<a name="line.843"></a>
-<span class="sourceLineNo">844</span>   public static Iterable&lt;Field&gt; getAllFields(final Class c, final boolean parentFirst) {<a name="line.844"></a>
-<span class="sourceLineNo">845</span>      return new Iterable&lt;Field&gt;() {<a name="line.845"></a>
-<span class="sourceLineNo">846</span>         @Override<a name="line.846"></a>
-<span class="sourceLineNo">847</span>         public Iterator&lt;Field&gt; iterator() {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>            return new Iterator&lt;Field&gt;(){<a name="line.848"></a>
-<span class="sourceLineNo">849</span>               final Iterator&lt;Class&lt;?&gt;&gt; classIterator = getParentClasses(c, parentFirst, false);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>               Field[] fields = classIterator.hasNext() ? sort(classIterator.next().getDeclaredFields()) : new Field[0];<a name="line.850"></a>
-<span class="sourceLineNo">851</span>               int fIndex = 0;<a name="line.851"></a>
-<span class="sourceLineNo">852</span>               Field next;<a name="line.852"></a>
-<span class="sourceLineNo">853</span><a name="line.853"></a>
-<span class="sourceLineNo">854</span>               @Override<a name="line.854"></a>
-<span class="sourceLineNo">855</span>               public boolean hasNext() {<a name="line.855"></a>
-<span class="sourceLineNo">856</span>                  prime();<a name="line.856"></a>
-<span class="sourceLineNo">857</span>                  return next != null;<a name="line.857"></a>
-<span class="sourceLineNo">858</span>               }<a name="line.858"></a>
+<span class="sourceLineNo">728</span>//       return cm;<a name="line.728"></a>
+<span class="sourceLineNo">729</span>//    } catch (ClassNotFoundException e) {<a name="line.729"></a>
+<span class="sourceLineNo">730</span>//       throw new RuntimeException(e);<a name="line.730"></a>
+<span class="sourceLineNo">731</span>//    }<a name="line.731"></a>
+<span class="sourceLineNo">732</span>// }<a name="line.732"></a>
+<span class="sourceLineNo">733</span>//<a name="line.733"></a>
+<span class="sourceLineNo">734</span>// private Class&lt;?&gt; findClass(String name) throws ClassNotFoundException {<a name="line.734"></a>
+<span class="sourceLineNo">735</span>//    return classLoader == null ? Class.forName(name) : Class.forName(name, true, classLoader);<a name="line.735"></a>
+<span class="sourceLineNo">736</span>// }<a name="line.736"></a>
+<span class="sourceLineNo">737</span><a name="line.737"></a>
+<span class="sourceLineNo">738</span>   /**<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    * Returns a {@link MethodInfo} bean that describes the specified method.<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    *<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    * @param m The method to describe.<a name="line.741"></a>
+<span class="sourceLineNo">742</span>    * @return The bean with information about the method.<a name="line.742"></a>
+<span class="sourceLineNo">743</span>    */<a name="line.743"></a>
+<span class="sourceLineNo">744</span>   public static MethodInfo getMethodInfo(Method m) {<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      return new MethodInfo(m);<a name="line.745"></a>
+<span class="sourceLineNo">746</span>   }<a name="line.746"></a>
+<span class="sourceLineNo">747</span><a name="line.747"></a>
+<span class="sourceLineNo">748</span>   /**<a name="line.748"></a>
+<span class="sourceLineNo">749</span>    * Returns {@link MethodInfo} beans that describe the specified methods.<a name="line.749"></a>
+<span class="sourceLineNo">750</span>    *<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    * @param m The methods to describe.<a name="line.751"></a>
+<span class="sourceLineNo">752</span>    * @return The beans with information about the methods.<a name="line.752"></a>
+<span class="sourceLineNo">753</span>    */<a name="line.753"></a>
+<span class="sourceLineNo">754</span>   public static MethodInfo[] getMethodInfo(Collection&lt;Method&gt; m) {<a name="line.754"></a>
+<span class="sourceLineNo">755</span>      MethodInfo[] mi = new MethodInfo[m.size()];<a name="line.755"></a>
+<span class="sourceLineNo">756</span>      int i = 0;<a name="line.756"></a>
+<span class="sourceLineNo">757</span>      for (Method mm : m)<a name="line.757"></a>
+<span class="sourceLineNo">758</span>         mi[i++] = getMethodInfo(mm);<a name="line.758"></a>
+<span class="sourceLineNo">759</span>      return mi;<a name="line.759"></a>
+<span class="sourceLineNo">760</span>   }<a name="line.760"></a>
+<span class="sourceLineNo">761</span><a name="line.761"></a>
+<span class="sourceLineNo">762</span>   /**<a name="line.762"></a>
+<span class="sourceLineNo">763</span>    * Simple bean that shows the name, parameter types, and return type of a method.<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    */<a name="line.764"></a>
+<span class="sourceLineNo">765</span>   @SuppressWarnings("javadoc")<a name="line.765"></a>
+<span class="sourceLineNo">766</span>   public static class MethodInfo {<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      public final String methodName;<a name="line.767"></a>
+<span class="sourceLineNo">768</span>      public final String[] parameterTypes;<a name="line.768"></a>
+<span class="sourceLineNo">769</span>      public final String returnType;<a name="line.769"></a>
+<span class="sourceLineNo">770</span><a name="line.770"></a>
+<span class="sourceLineNo">771</span>      MethodInfo(Method m) {<a name="line.771"></a>
+<span class="sourceLineNo">772</span>         methodName = m.getName();<a name="line.772"></a>
+<span class="sourceLineNo">773</span>         Type[] pt = m.getGenericParameterTypes();<a name="line.773"></a>
+<span class="sourceLineNo">774</span>         parameterTypes = new String[pt.length];<a name="line.774"></a>
+<span class="sourceLineNo">775</span>         for (int i  = 0; i &lt; pt.length; i++)<a name="line.775"></a>
+<span class="sourceLineNo">776</span>            parameterTypes[i] = BeanContext.DEFAULT.getClassMeta(pt[i]).toString();<a name="line.776"></a>
+<span class="sourceLineNo">777</span>         returnType = BeanContext.DEFAULT.getClassMeta(m.getGenericReturnType()).toString();<a name="line.777"></a>
+<span class="sourceLineNo">778</span>      }<a name="line.778"></a>
+<span class="sourceLineNo">779</span>   }<a name="line.779"></a>
+<span class="sourceLineNo">780</span><a name="line.780"></a>
+<span class="sourceLineNo">781</span>   /**<a name="line.781"></a>
+<span class="sourceLineNo">782</span>    * Creates an instance of the specified class without throwing exceptions.<a name="line.782"></a>
+<span class="sourceLineNo">783</span>    *<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    * @param c The class to cast to.<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    * @param c2<a name="line.785"></a>
+<span class="sourceLineNo">786</span>    *    The class to instantiate.<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    *    Can also be an instance of the class.<a name="line.787"></a>
+<span class="sourceLineNo">788</span>    * @param args The arguments to pass to the constructor.<a name="line.788"></a>
+<span class="sourceLineNo">789</span>    * @return The new class instance, or &lt;jk&gt;null&lt;/jk&gt; if the class was &lt;jk&gt;null&lt;/jk&gt; or is abstract or an interface.<a name="line.789"></a>
+<span class="sourceLineNo">790</span>    * @throws RuntimeException if constructor could not be found or called.<a name="line.790"></a>
+<span class="sourceLineNo">791</span>    */<a name="line.791"></a>
+<span class="sourceLineNo">792</span>   public static &lt;T&gt; T newInstance(Class&lt;T&gt; c, Object c2, Object...args) {<a name="line.792"></a>
+<span class="sourceLineNo">793</span>      return newInstanceFromOuter(null, c, c2, args);<a name="line.793"></a>
+<span class="sourceLineNo">794</span>   }<a name="line.794"></a>
+<span class="sourceLineNo">795</span><a name="line.795"></a>
+<span class="sourceLineNo">796</span>   /**<a name="line.796"></a>
+<span class="sourceLineNo">797</span>    * Creates an instance of the specified class from within the context of another object.<a name="line.797"></a>
+<span class="sourceLineNo">798</span>    *<a name="line.798"></a>
+<span class="sourceLineNo">799</span>    * @param outer<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    *    The outer object.<a name="line.800"></a>
+<span class="sourceLineNo">801</span>    *    Can be &lt;jk&gt;null&lt;/jk&gt;.<a name="line.801"></a>
+<span class="sourceLineNo">802</span>    * @param c The class to cast to.<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    * @param c2<a name="line.803"></a>
+<span class="sourceLineNo">804</span>    *    The class to instantiate.<a name="line.804"></a>
+<span class="sourceLineNo">805</span>    *    Can also be an instance of the class.<a name="line.805"></a>
+<span class="sourceLineNo">806</span>    * @param args The arguments to pass to the constructor.<a name="line.806"></a>
+<span class="sourceLineNo">807</span>    * @return The new class instance, or &lt;jk&gt;null&lt;/jk&gt; if the class was &lt;jk&gt;null&lt;/jk&gt; or is abstract or an interface.<a name="line.807"></a>
+<span class="sourceLineNo">808</span>    * @throws RuntimeException if constructor could not be found or called.<a name="line.808"></a>
+<span class="sourceLineNo">809</span>    */<a name="line.809"></a>
+<span class="sourceLineNo">810</span>   @SuppressWarnings("unchecked")<a name="line.810"></a>
+<span class="sourceLineNo">811</span>   public static &lt;T&gt; T newInstanceFromOuter(Object outer, Class&lt;T&gt; c, Object c2, Object...args) {<a name="line.811"></a>
+<span class="sourceLineNo">812</span>      if (c2 == null)<a name="line.812"></a>
+<span class="sourceLineNo">813</span>         return null;<a name="line.813"></a>
+<span class="sourceLineNo">814</span>      if (c2 instanceof Class) {<a name="line.814"></a>
+<span class="sourceLineNo">815</span>         try {<a name="line.815"></a>
+<span class="sourceLineNo">816</span>            Class&lt;?&gt; c3 = (Class&lt;?&gt;)c2;<a name="line.816"></a>
+<span class="sourceLineNo">817</span>            if (c3.isInterface() || isAbstract(c3))<a name="line.817"></a>
+<span class="sourceLineNo">818</span>               return null;<a name="line.818"></a>
+<span class="sourceLineNo">819</span>            Constructor&lt;?&gt; con = findPublicConstructor(c3, args);<a name="line.819"></a>
+<span class="sourceLineNo">820</span>            if (con != null)<a name="line.820"></a>
+<span class="sourceLineNo">821</span>               return (T)con.newInstance(args);<a name="line.821"></a>
+<span class="sourceLineNo">822</span>            if (outer != null) {<a name="line.822"></a>
+<span class="sourceLineNo">823</span>               Object[] args2 = new AList&lt;Object&gt;().append(outer).appendAll(args).toArray();<a name="line.823"></a>
+<span class="sourceLineNo">824</span>               con = findPublicConstructor(c3, args2);<a name="line.824"></a>
+<span class="sourceLineNo">825</span>               if (con != null)<a name="line.825"></a>
+<span class="sourceLineNo">826</span>                  return (T)con.newInstance(args2);<a name="line.826"></a>
+<span class="sourceLineNo">827</span>            }<a name="line.827"></a>
+<span class="sourceLineNo">828</span>            return (T)c3.getConstructor(getClasses(args)).newInstance(args);<a name="line.828"></a>
+<span class="sourceLineNo">829</span>         } catch (Exception e) {<a name="line.829"></a>
+<span class="sourceLineNo">830</span>            throw new FormattedRuntimeException(e, "Could not instantiate class {0}", c.getName());<a name="line.830"></a>
+<span class="sourceLineNo">831</span>         }<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      } else if (isParentClass(c, c2.getClass())) {<a name="line.832"></a>
+<span class="sourceLineNo">833</span>         return (T)c2;<a name="line.833"></a>
+<span class="sourceLineNo">834</span>      } else {<a name="line.834"></a>
+<span class="sourceLineNo">835</span>         throw new FormattedRuntimeException("Object of type {0} found but was expecting {1}.", c2.getClass(), c.getClass());<a name="line.835"></a>
+<span class="sourceLineNo">836</span>      }<a name="line.836"></a>
+<span class="sourceLineNo">837</span>   }<a name="line.837"></a>
+<span class="sourceLineNo">838</span><a name="line.838"></a>
+<span class="sourceLineNo">839</span>   /**<a name="line.839"></a>
+<span class="sourceLineNo">840</span>    * Returns all the fields in the specified class and all parent classes.<a name="line.840"></a>
+<span class="sourceLineNo">841</span>    *<a name="line.841"></a>
+<span class="sourceLineNo">842</span>    * &lt;p&gt;<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    * Fields are ordered in either parent-to-child, or child-to-parent order, then alphabetically.<a name="line.843"></a>
+<span class="sourceLineNo">844</span>    *<a name="line.844"></a>
+<span class="sourceLineNo">845</span>    * @param c The class to get all fields on.<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    * @param parentFirst Order them in parent-class-to-child-class order, otherwise child-class-to-parent-class order.<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    * @return An iterable of all fields in the specified class.<a name="line.847"></a>
+<span class="sourceLineNo">848</span>    */<a name="line.848"></a>
+<span class="sourceLineNo">849</span>   @SuppressWarnings("rawtypes")<a name="line.849"></a>
+<span class="sourceLineNo">850</span>   public static Iterable&lt;Field&gt; getAllFields(final Class c, final boolean parentFirst) {<a name="line.850"></a>
+<span class="sourceLineNo">851</span>      return new Iterable&lt;Field&gt;() {<a name="line.851"></a>
+<span class="sourceLineNo">852</span>         @Override<a name="line.852"></a>
+<span class="sourceLineNo">853</span>         public Iterator&lt;Field&gt; iterator() {<a name="line.853"></a>
+<span class="sourceLineNo">854</span>            return new Iterator&lt;Field&gt;(){<a name="line.854"></a>
+<span class="sourceLineNo">855</span>               final Iterator&lt;Class&lt;?&gt;&gt; classIterator = getParentClasses(c, parentFirst, false);<a name="line.855"></a>
+<span class="sourceLineNo">856</span>               Field[] fields = classIterator.hasNext() ? sort(classIterator.next().getDeclaredFields()) : new Field[0];<a name="line.856"></a>
+<span class="sourceLineNo">857</span>               int fIndex = 0;<a name="line.857"></a>
+<span class="sourceLineNo">858</span>               Field next;<a name="line.858"></a>
 <span class="sourceLineNo">859</span><a name="line.859"></a>
-<span class="sourceLineNo">860</span>               private void prime() {<a name="line.860"></a>
-<span class="sourceLineNo">861</span>                  if (next == null) {<a name="line.861"></a>
-<span class="sourceLineNo">862</span>                     while (fIndex &gt;= fields.length) {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>                        if (classIterator.hasNext()) {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>                           fields = sort(classIterator.next().getDeclaredFields());<a name="line.864"></a>
-<span class="sourceLineNo">865</span>                           fIndex = 0;<a name="line.865"></a>
-<span class="sourceLineNo">866</span>                        } else {<a name="line.866"></a>
-<span class="sourceLineNo">867</span>                           fIndex = -1;<a name="line.867"></a>
-<span class="sourceLineNo">868</span>                        }<a name="line.868"></a>
-<span class="sourceLineNo">869</span>                     }<a name="line.869"></a>
-<span class="sourceLineNo">870</span>                     if (fIndex != -1)<a name="line.870"></a>
-<span class="sourceLineNo">871</span>                        next = fields[fIndex++];<a name="line.871"></a>
-<span class="sourceLineNo">872</span>                  }<a name="line.872"></a>
-<span class="sourceLineNo">873</span>               }<a name="line.873"></a>
-<span class="sourceLineNo">874</span><a name="line.874"></a>
-<span class="sourceLineNo">875</span>               @Override<a name="line.875"></a>
-<span class="sourceLineNo">876</span>               public Field next() {<a name="line.876"></a>
-<span class="sourceLineNo">877</span>                  prime();<a name="line.877"></a>
-<span class="sourceLineNo">878</span>                  Field f = next;<a name="line.878"></a>
-<span class="sourceLineNo">879</span>                  next = null;<a name="line.879"></a>
-<span class="sourceLineNo">880</span>                  return f;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>               }<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>               @Override<a name="line.883"></a>
-<span class="sourceLineNo">884</span>               public void remove() {<a name="line.884"></a>
-<span class="sourceLineNo">885</span>               }<a name="line.885"></a>
-<span class="sourceLineNo">886</span>            };<a name="line.886"></a>
-<span class="sourceLineNo">887</span>         }<a name="line.887"></a>
-<span class="sourceLineNo">888</span>      };<a name="line.888"></a>
-<span class="sourceLineNo">889</span>   }<a name="line.889"></a>
-<span class="sourceLineNo">890</span><a name="line.890"></a>
-<span class="sourceLineNo">891</span>   /**<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    * Returns all the methods in the specified class and all parent classes.<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    *<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    * &lt;p&gt;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>    * Methods are ordered in either parent-to-child, or child-to-parent order, then alphabetically.<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    *<a name="line.896"></a>
-<span class="sourceLineNo">897</span>    * @param c The class to get all methods on.<a name="line.897"></a>
-<span class="sourceLineNo">898</span>    * @param parentFirst Order them in parent-class-to-child-class order, otherwise child-class-to-parent-class order.<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    * @return An iterable of all methods in the specified class.<a name="line.899"></a>
-<span class="sourceLineNo">900</span>    */<a name="line.900"></a>
-<span class="sourceLineNo">901</span>   @SuppressWarnings("rawtypes")<a name="line.901"></a>
-<span class="sourceLineNo">902</span>   public static Iterable&lt;Method&gt; getAllMethods(final Class c, final boolean parentFirst) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      return new Iterable&lt;Method&gt;() {<a name="line.903"></a>
-<span class="sourceLineNo">904</span>         @Override<a name="line.904"></a>
-<span class="sourceLineNo">905</span>         public Iterator&lt;Method&gt; iterator() {<a name="line.905"></a>
-<span class="sourceLineNo">906</span>            return new Iterator&lt;Method&gt;(){<a name="line.906"></a>
-<span class="sourceLineNo">907</span>               final Iterator&lt;Class&lt;?&gt;&gt; classIterator = getParentClasses(c, parentFirst, true);<a name="line.907"></a>
-<span class="sourceLineNo">908</span>               Method[] methods = classIterator.hasNext() ? sort(classIterator.next().getDeclaredMethods()) : new Method[0];<a name="line.908"></a>
-<span class="sourceLineNo">909</span>               int mIndex = 0;<a name="line.909"></a>
-<span class="sourceLineNo">910</span>               Method next;<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>               @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>               public boolean hasNext() {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>                  prime();<a name="line.914"></a>
-<span class="sourceLineNo">915</span>                  return next != null;<a name="line.915"></a>
-<span class="sourceLineNo">916</span>               }<a name="line.916"></a>
+<span class="sourceLineNo">860</span>               @Override<a name="line.860"></a>
+<span class="sourceLineNo">861</span>               public boolean hasNext() {<a name="line.861"></a>
+<span class="sourceLineNo">862</span>                  prime();<a name="line.862"></a>
+<span class="sourceLineNo">863</span>                  return next != null;<a name="line.863"></a>
+<span class="sourceLineNo">864</span>               }<a name="line.864"></a>
+<span class="sourceLineNo">865</span><a name="line.865"></a>
+<span class="sourceLineNo">866</span>               private void prime() {<a name="line.866"></a>
+<span class="sourceLineNo">867</span>                  if (next == null) {<a name="line.867"></a>
+<span class="sourceLineNo">868</span>                     while (fIndex &gt;= fields.length) {<a name="line.868"></a>
+<span class="sourceLineNo">869</span>                        if (classIterator.hasNext()) {<a name="line.869"></a>
+<span class="sourceLineNo">870</span>                           fields = sort(classIterator.next().getDeclaredFields());<a name="line.870"></a>
+<span class="sourceLineNo">871</span>                           fIndex = 0;<a name="line.871"></a>
+<span class="sourceLineNo">872</span>                        } else {<a name="line.872"></a>
+<span class="sourceLineNo">873</span>                           fIndex = -1;<a name="line.873"></a>
+<span class="sourceLineNo">874</span>                        }<a name="line.874"></a>
+<span class="sourceLineNo">875</span>                     }<a name="line.875"></a>
+<span class="sourceLineNo">876</span>                     if (fIndex != -1)<a name="line.876"></a>
+<span class="sourceLineNo">877</span>                        next = fields[fIndex++];<a name="line.877"></a>
+<span class="sourceLineNo">878</span>                  }<a name="line.878"></a>
+<span class="sourceLineNo">879</span>               }<a name="line.879"></a>
+<span class="sourceLineNo">880</span><a name="line.880"></a>
+<span class="sourceLineNo">881</span>               @Override<a name="line.881"></a>
+<span class="sourceLineNo">882</span>               public Field next() {<a name="line.882"></a>
+<span class="sourceLineNo">883</span>                  prime();<a name="line.883"></a>
+<span class="sourceLineNo">884</span>                  Field f = next;<a name="line.884"></a>
+<span class="sour

<TRUNCATED>