228 lines · 7.3 KB · Java
RawDownload
/* * Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.  Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package java.beans; import java.lang.ref.Reference;import java.lang.ref.WeakReference;import java.lang.reflect.Method;import java.util.List;import java.util.ArrayList; /** * A MethodDescriptor describes a particular method that a Java Bean * supports for external access from other components. */ public class MethodDescriptor extends FeatureDescriptor {     private Reference<Method> methodRef;     private String[] paramNames;     private List params;     private ParameterDescriptor parameterDescriptors[];     /**     * Constructs a <code>MethodDescriptor</code> from a     * <code>Method</code>.     *     * @param method    The low-level method information.     */    public MethodDescriptor(Method method) {        this(method, null);    }      /**     * Constructs a <code>MethodDescriptor</code> from a     * <code>Method</code> providing descriptive information for each     * of the method's parameters.     *     * @param method    The low-level method information.     * @param parameterDescriptors  Descriptive information for each of the     *                          method's parameters.     */    public MethodDescriptor(Method method,                ParameterDescriptor parameterDescriptors[]) {        setName(method.getName());        setMethod(method);        this.parameterDescriptors = parameterDescriptors;    }     /**     * Gets the method that this MethodDescriptor encapsualtes.     *     * @return The low-level description of the method     */    public synchronized Method getMethod() {        Method method = getMethod0();        if (method == null) {            Class cls = getClass0();            String name = getName();            if ((cls != null) && (name != null)) {                Class[] params = getParams();                if (params == null) {                    for (int i = 0; i < 3; i++) {                        // Find methods for up to 2 params. We are guessing here.                        // This block should never execute unless the classloader                        // that loaded the argument classes disappears.                        method = Introspector.findMethod(cls, name, i, null);                        if (method != null) {                            break;                        }                    }                } else {                    method = Introspector.findMethod(cls, name, params.length, params);                }                setMethod(method);            }        }        return method;    }     private synchronized void setMethod(Method method) {        if (method == null) {            return;        }        if (getClass0() == null) {            setClass0(method.getDeclaringClass());        }        setParams(getParameterTypes(getClass0(), method));        this.methodRef = getSoftReference(method);    }     private Method getMethod0() {        return (this.methodRef != null)                ? this.methodRef.get()                : null;    }     private synchronized void setParams(Class[] param) {        if (param == null) {            return;        }        paramNames = new String[param.length];        params = new ArrayList(param.length);        for (int i = 0; i < param.length; i++) {            paramNames[i] = param[i].getName();            params.add(new WeakReference(param[i]));        }    }     // pp getParamNames used as an optimization to avoid method.getParameterTypes.    String[] getParamNames() {        return paramNames;    }     private synchronized Class[] getParams() {        Class[] clss = new Class[params.size()];         for (int i = 0; i < params.size(); i++) {            Reference ref = (Reference)params.get(i);            Class cls = (Class)ref.get();            if (cls == null) {                return null;            } else {                clss[i] = cls;            }        }        return clss;    }     /**     * Gets the ParameterDescriptor for each of this MethodDescriptor's     * method's parameters.     *     * @return The locale-independent names of the parameters.  May return     *          a null array if the parameter names aren't known.     */    public ParameterDescriptor[] getParameterDescriptors() {        return parameterDescriptors;    }     /*     * Package-private constructor     * Merge two method descriptors.  Where they conflict, give the     * second argument (y) priority over the first argument (x).     * @param x  The first (lower priority) MethodDescriptor     * @param y  The second (higher priority) MethodDescriptor     */     MethodDescriptor(MethodDescriptor x, MethodDescriptor y) {        super(x,y);         methodRef = x.methodRef;        if (y.methodRef != null) {            methodRef = y.methodRef;        }        params = x.params;        if (y.params != null) {            params = y.params;        }        paramNames = x.paramNames;        if (y.paramNames != null) {            paramNames = y.paramNames;        }         parameterDescriptors = x.parameterDescriptors;        if (y.parameterDescriptors != null) {            parameterDescriptors = y.parameterDescriptors;        }    }     /*     * Package-private dup constructor     * This must isolate the new object from any changes to the old object.     */    MethodDescriptor(MethodDescriptor old) {        super(old);         methodRef = old.methodRef;        params = old.params;        paramNames = old.paramNames;         if (old.parameterDescriptors != null) {            int len = old.parameterDescriptors.length;            parameterDescriptors = new ParameterDescriptor[len];            for (int i = 0; i < len ; i++) {                parameterDescriptors[i] = new ParameterDescriptor(old.parameterDescriptors[i]);            }        }    }     void appendTo(StringBuilder sb) {        appendTo(sb, "method", this.methodRef);        if (this.parameterDescriptors != null) {            sb.append("; parameterDescriptors={");            for (ParameterDescriptor pd : this.parameterDescriptors) {                sb.append(pd).append(", ");            }            sb.setLength(sb.length() - 2);            sb.append("}");        }    }}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t