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 + -
显示快捷键?