methodcall.java

来自「JGRoups源码」· Java 代码 · 共 527 行 · 第 1/2 页

JAVA
527
字号
            Method m = methods[i];            if (!methodName.equals(m.getName())) {                continue;            }            Class[] parameters = m.getParameterTypes();            if (types.length != parameters.length) {                continue;            }            for(int j = 0; j < types.length; j++) {                if (!types[j].equals(parameters[j])) {                    continue methods;                }            }            return m;        }        return null;    }    /**     * Invokes the method with the supplied arguments against the target object.     * If a method lookup is provided, it will be used. Otherwise, the default     * method lookup will be used.     * @param target - the object that you want to invoke the method on     * @return an object     */    public Object invoke(Object target) throws Throwable {        Class  cl;        Method meth=null;        Object retval=null;        if(method_name == null || target == null) {            if(log.isErrorEnabled()) log.error("method name or target is null");            return null;        }        cl=target.getClass();        try {            switch(mode) {            case OLD:                meth=findMethod(cl);                break;            case METHOD:                if(this.method != null)                    meth=this.method;                break;            case TYPES:                //meth=cl.getDeclaredMethod(method_name, types);                meth = getMethod(cl, method_name, types);                break;            case SIGNATURE:                Class[] mytypes=null;                if(signature != null)                    mytypes=getTypesFromString(cl, signature);                //meth=cl.getDeclaredMethod(method_name, mytypes);                meth = getMethod(cl, method_name, mytypes);                break;            case ID:                break;            default:                if(log.isErrorEnabled()) log.error("mode " + mode + " is invalid");                break;            }            if(meth != null) {                retval=meth.invoke(target, args);            }            else {                throw new NoSuchMethodException(method_name);            }            return retval;        }        catch(InvocationTargetException inv_ex) {            throw inv_ex.getTargetException();        }        catch(NoSuchMethodException no) {            StringBuffer sb=new StringBuffer();            sb.append("found no method called ").append(method_name).append(" in class ");            sb.append(cl.getName()).append(" with (");            if(args != null) {                for(int i=0; i < args.length; i++) {                    if(i > 0)                        sb.append(", ");                    sb.append((args[i] != null)? args[i].getClass().getName() : "null");                }            }            sb.append(") formal parameters");            log.error(sb.toString());            throw no;        }        catch(Throwable e) {            // e.printStackTrace(System.err);            if(log.isErrorEnabled()) log.error("exception in invoke()", e);            throw e;        }    }    public Object invoke(Object target, Object[] args) throws Throwable {        if(args != null)            this.args=args;        return invoke(target);    }    Class[] getTypesFromString(Class cl, String[] signature) throws Exception {        String  name;        Class   parameter;        Class[] mytypes=new Class[signature.length];        for(int i=0; i < signature.length; i++) {            name=signature[i];            if("long".equals(name))                parameter=long.class;            else if("int".equals(name))                parameter=int.class;            else if("short".equals(name))                parameter=short.class;            else if("char".equals(name))                parameter=char.class;            else if("byte".equals(name))                parameter=byte.class;            else if("float".equals(name))                parameter=float.class;            else if("double".equals(name))                parameter=double.class;            else if("boolean".equals(name))                parameter=boolean.class;            else                parameter=Class.forName(name, false, cl.getClassLoader());            mytypes[i]=parameter;        }        return mytypes;    }    public String toString() {        StringBuffer ret=new StringBuffer();        boolean first=true;        if(method_name != null)            ret.append(method_name);        else            ret.append(method_id);        ret.append('(');        if(args != null) {            for(int i=0; i < args.length; i++) {                if(first)                    first=false;                else                    ret.append(", ");                ret.append(args[i]);            }        }        ret.append(')');        return ret.toString();    }    public String toStringDetails() {        StringBuffer ret=new StringBuffer();        ret.append("MethodCall ");        if(method_name != null)            ret.append("name=").append(method_name);        else            ret.append("id=").append(method_id);        ret.append(", number of args=").append((args != null? args.length : 0)).append(')');        if(args != null) {            ret.append("\nArgs:");            for(int i=0; i < args.length; i++) {                ret.append("\n[").append(args[i]).append(" (").                        append((args[i] != null? args[i].getClass().getName() : "null")).append(")]");            }        }        return ret.toString();    }    public void writeExternal(ObjectOutput out) throws IOException {        if(method_name != null) {            out.writeBoolean(true);            out.writeUTF(method_name);        }        else {            out.writeBoolean(false);            out.writeShort(method_id);        }        out.writeObject(args);        out.writeShort(mode);        switch(mode) {        case OLD:            break;        case METHOD:            out.writeObject(method.getParameterTypes());            out.writeObject(method.getDeclaringClass());            break;        case TYPES:            out.writeObject(types);            break;        case SIGNATURE:            out.writeObject(signature);            break;        case ID:            break;        default:            if(log.isErrorEnabled()) log.error("mode " + mode + " is invalid");            break;        }        if(payload != null) {            out.writeBoolean(true);            out.writeObject(payload);        }        else {            out.writeBoolean(false);        }    }    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {        boolean name_available=in.readBoolean();        if(name_available)            method_name=in.readUTF();        else            method_id=in.readShort();        args=(Object[])in.readObject();        mode=in.readShort();        switch(mode) {        case OLD:            break;        case METHOD:            Class[] parametertypes=(Class[])in.readObject();            Class   declaringclass=(Class)in.readObject();            try {                method=declaringclass.getDeclaredMethod(method_name, parametertypes);            }            catch(NoSuchMethodException e) {                throw new IOException(e.toString());            }            break;        case TYPES:            types=(Class[])in.readObject();            break;        case SIGNATURE:            signature=(String[])in.readObject();            break;        case ID:            break;        default:            if(log.isErrorEnabled()) log.error("mode " + mode + " is invalid");            break;        }        boolean payload_available=in.readBoolean();        if(payload_available) {            payload=(Map)in.readObject();        }    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?