boot/src/main/java/org/apidesign/html/boot/impl/FnUtils.java
branchclassloader
changeset 161 ea5ca9cc685d
parent 160 b5a06e2b3b92
child 163 2652760705d6
     1.1 --- a/boot/src/main/java/org/apidesign/html/boot/impl/FnUtils.java	Tue Jun 25 15:34:37 2013 +0200
     1.2 +++ b/boot/src/main/java/org/apidesign/html/boot/impl/FnUtils.java	Tue Jun 25 21:09:48 2013 +0200
     1.3 @@ -26,17 +26,14 @@
     1.4  import java.util.Collections;
     1.5  import java.util.Enumeration;
     1.6  import java.util.List;
     1.7 -import java.util.logging.Level;
     1.8 -import java.util.logging.Logger;
     1.9 -import java.util.regex.Pattern;
    1.10  import org.apidesign.html.boot.spi.Fn;
    1.11 +import org.objectweb.asm.Type;
    1.12  
    1.13  /**
    1.14   *
    1.15   * @author Jaroslav Tulach <jtulach@netbeans.org>
    1.16   */
    1.17  public final class FnUtils {
    1.18 -
    1.19      private FnUtils() {
    1.20      }
    1.21  
    1.22 @@ -104,10 +101,15 @@
    1.23              
    1.24              String fqn = body.substring(next + 2, colon4);
    1.25              String method = body.substring(colon4 + 2, sigBeg);
    1.26 -            String params = body.substring(sigBeg + 1, sigEnd);
    1.27 +            String params = body.substring(sigBeg, sigEnd + 1);
    1.28              
    1.29              Class<?> clazz = Class.forName(fqn, false, loader);
    1.30 -            Method m = clazz.getMethod(method);
    1.31 +            final Type[] argTps = Type.getArgumentTypes(params);
    1.32 +            Class<?>[] argCls = new Class<?>[argTps.length];
    1.33 +            for (int i = 0; i < argCls.length; i++) {
    1.34 +                argCls[i] = toClass(argTps[i], loader);
    1.35 +            }
    1.36 +            Method m = clazz.getMethod(method, argCls);
    1.37              
    1.38              sb.append("['").append(m.getName()).append("(");
    1.39              String sep = "";
    1.40 @@ -121,5 +123,27 @@
    1.41          }
    1.42      }
    1.43  
    1.44 +    private static Class<?> toClass(final Type t, ClassLoader loader) throws ClassNotFoundException {
    1.45 +        if (t == Type.INT_TYPE) {
    1.46 +            return Integer.TYPE;
    1.47 +        } else if (t == Type.VOID_TYPE) {
    1.48 +            return Void.TYPE;
    1.49 +        } else if (t == Type.BOOLEAN_TYPE) {
    1.50 +            return Boolean.TYPE;
    1.51 +        } else if (t == Type.BYTE_TYPE) {
    1.52 +            return Byte.TYPE;
    1.53 +        } else if (t == Type.CHAR_TYPE) {
    1.54 +            return Character.TYPE;
    1.55 +        } else if (t == Type.SHORT_TYPE) {
    1.56 +            return Short.TYPE;
    1.57 +        } else if (t == Type.DOUBLE_TYPE) {
    1.58 +            return Double.TYPE;
    1.59 +        } else if (t == Type.FLOAT_TYPE) {
    1.60 +            return Float.TYPE;
    1.61 +        } else if (t == Type.LONG_TYPE) {
    1.62 +            return Long.TYPE;
    1.63 +        }
    1.64 +        return Class.forName(t.getClassName(), false, loader);
    1.65 +    }
    1.66      
    1.67  }