public static Term invoke(Term c, Term m, Quote params) {
        String cname = null;
        Object o = null;
        String method = m.svalue();
        if (c.type != v.Type.TSymbol) {
            o = getJavaObj(c);
            cname = o.getClass().getName();
        } else {
            cname = c.svalue();
            o = null; // static invocation.
        }

        try {
            if (method.equals("new")) {
                if (o != null)
                    throw new VException("err:java:invalid_class_name",c, "Java Exception invalid class");
                Constructor cons = getConstructor(cname, params);
                Object[] args = getParams(params);
                return getResult(cons.newInstance(args));
            } else if (method.endsWith("$")) {
                // TODO: static field.
                // Field.
                Field fld = getField(cname, method);
                // is it get or set?
                int size = ((QuoteStream)params.tokens()).size();

                if (size > 0) { // set
                    Object no = getJavaObj(((QuoteStream)params.tokens()).get(0));
                    fld.set(o, no);
                    return getResult(no);
                } else { // get
                    return getResult(fld.get(o));
                }
            } else {
                Method mtd = getMethod(cname, m, params);
                Object[] args = getParams(params);
                return getResult(mtd.invoke(o, args));
            }
        } catch (IllegalAccessException e) {
            throw new VException("err:java:invoke:illegalaccess",c,cname+"."+method + " Java Exception : " + e.getMessage());
        } catch (InvocationTargetException e) {
            throw new VException("err:java:invoke:invocationtarget", c,cname+"."+method+" Java Exception : " + e.getMessage());
        } catch (InstantiationException e) {
            throw new VException("err:java:invoke:instantiation", c,cname+"."+method+" Java Exception : " + e.getMessage());
        }
    }