methodcall.java

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

JAVA
527
字号
package org.jgroups.blocks;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import java.io.Externalizable;import java.io.IOException;import java.io.ObjectInput;import java.io.ObjectOutput;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.*;/** * A method call is the JGroups representation of a remote method. * It includes the name of the method (case sensitive) and a list of arguments. * A method call is serializable and can be passed over the wire. * @author Bela Ban * @version $Revision: 1.24 $ */public class MethodCall implements Externalizable {    private static final long serialVersionUID=7873471327078957662L;    /** The name of the method, case sensitive. */    protected String method_name;    /** The ID of a method, maps to a java.lang.reflect.Method */    protected short method_id=-1;    /** The arguments of the method. */    protected Object[] args;    /** The class types, e.g., new Class[]{String.class, int.class}. */    protected Class[] types;    /** The signature, e.g., new String[]{String.class.getName(), int.class.getName()}. */    protected String[] signature;    /** The Method of the call. */    protected Method method;    /** To carry arbitrary data with a method call, data needs to be serializable if sent across the wire */    protected Map payload;    protected static final Log log=LogFactory.getLog(MethodCall.class);    /** Which mode to use. */    protected short mode=OLD;    /** Infer the method from the arguments. */    protected static final short OLD=1;    /** Explicitly ship the method, caller has to determine method himself. */    protected static final short METHOD=2;    /** Use class information. */    protected static final short TYPES=3;    /** Provide a signature, similar to JMX. */    protected static final short SIGNATURE=4;    /** Use an ID to map to a method */    protected static final short ID=5;    /**     * Creates an empty method call, this is always invalid, until     * <code>setName()</code> has been called.     */    public MethodCall() {    }    public MethodCall(Method method) {        this(method, null);    }    public MethodCall(Method method, Object[] arguments) {        init(method);        if(arguments != null) args=arguments;    }    /**     *     * @param method_name     * @param args     * @deprecated Use one of the constructors that take class types as arguments     */    public MethodCall(String method_name, Object[] args) {        this.method_name=method_name;        this.mode=OLD;        this.args=args;    }    public MethodCall(short method_id, Object[] args) {        this.method_id=method_id;        this.mode=ID;        this.args=args;    }    public MethodCall(String method_name, Object[] args, Class[] types) {        this.method_name=method_name;        this.args=args;        this.types=types;        this.mode=TYPES;    }    public MethodCall(String method_name, Object[] args, String[] signature) {        this.method_name=method_name;        this.args=args;        this.signature=signature;        this.mode=SIGNATURE;    }    private void init(Method method) {        this.method=method;        this.mode=METHOD;        method_name=method.getName();    }    public int getMode() {        return mode;    }    /**     * returns the name of the method to be invoked using this method call object     * @return a case sensitive name, can be null for an invalid method call     */    public String getName() {        return method_name;    }    /**     * sets the name for this MethodCall and allowing you to reuse the same object for     * a different method invokation of a different method     * @param n - a case sensitive method name     */    public void setName(String n) {        method_name=n;    }    public short getId() {        return method_id;    }    public void setId(short method_id) {        this.method_id=method_id;    }    /**     * returns an ordered list of arguments used for the method invokation     * @return returns the list of ordered arguments     */    public Object[] getArgs() {        return args;    }    public void setArgs(Object[] args) {        if(args != null)            this.args=args;    }    public Method getMethod() {        return method;    }    public void setMethod(Method m) {        init(m);    }    public synchronized Object put(Object key, Object value) {        if(payload == null)            payload=new HashMap();        return payload.put(key, value);    }    public synchronized Object get(Object key) {        return payload != null? payload.get(key) : null;    }    /**     *     * @param target_class     * @return     * @throws Exception     */    Method findMethod(Class target_class) throws Exception {        int     len=args != null? args.length : 0;        Method  m;        Method[] methods=getAllMethods(target_class);        for(int i=0; i < methods.length; i++) {            m=methods[i];            if(m.getName().equals(method_name)) {                if(m.getParameterTypes().length == len)                    return m;            }        }        return null;    }    /**     * The method walks up the class hierarchy and returns <i>all</i> methods of this class     * and those inherited from superclasses and superinterfaces.     */    Method[] getAllMethods(Class target) {        Class superclass = target;        List methods = new ArrayList();        int size = 0;        while(superclass != null) {            try {                Method[] m = superclass.getDeclaredMethods();                methods.add(m);                size += m.length;                superclass = superclass.getSuperclass();            }            catch(SecurityException e) {                // if it runs in an applet context, it won't be able to retrieve                // methods from superclasses that belong to the java VM and it will                // raise a security exception, so we catch it here.                if(log.isWarnEnabled())                    log.warn("unable to enumerate methods of superclass "+superclass+" of class "+target);                superclass=null;            }        }        Method[] result = new Method[size];        int index = 0;        for(Iterator i = methods.iterator(); i.hasNext();) {            Method[] m = (Method[])i.next();            System.arraycopy(m, 0, result, index, m.length);            index += m.length;        }        return result;    }    /**     * Returns the first method that matches the specified name and parameter types. The overriding     * methods have priority. The method is chosen from all the methods of the current class and all     * its superclasses and superinterfaces.     *     * @return the matching method or null if no mathching method has been found.     */    Method getMethod(Class target, String methodName, Class[] types) {        if (types == null) {            types = new Class[0];        }        Method[] methods = getAllMethods(target);        methods: for(int i = 0; i < methods.length; i++) {

⌨️ 快捷键说明

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