429 lines · 15.7 KB · Java
RawDownload
/* * Copyright (c) 1998, 2005, 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 com.sun.jdi; import java.util.List; /** * A static or instance method in the target VM. See {@link TypeComponent} * for general information about Field and Method mirrors. * * @see ObjectReference * @see ReferenceType * * @author Robert Field * @author Gordon Hirsch * @author James McIlree * @since  1.3 */public interface Method extends TypeComponent, Locatable, Comparable<Method> {     /**     * Returns a text representation of the return type,     * as specified in the declaration of this method.     * <P>     * This type name is always available even if     * the type has not yet been created or loaded.     *     * @return a String containing the return type name.     */    String returnTypeName();     /**     * Returns the return type,     * as specified in the declaration of this method.     * <P>     * Note: if the return type of this method is a reference type (class,     * interface, or array) and it has not been created or loaded     * by the declaring type's class loader - that is,     * {@link TypeComponent#declaringType <CODE>declaringType()</CODE>}     * <CODE>.classLoader()</CODE>,     * then ClassNotLoadedException will be thrown.     * Also, a reference type may have been loaded but not yet prepared,     * in which case the type will be returned     * but attempts to perform some operations on the returned type     * (e.g. {@link ReferenceType#fields() fields()}) will throw     * a {@link ClassNotPreparedException}.     * Use {@link ReferenceType#isPrepared()} to determine if     * a reference type is prepared.     *     * @see Type     * @see Field#type() Field.type() - for usage examples     * @return the return {@link Type} of this method.     * @throws ClassNotLoadedException if the type has not yet been     * created or loaded     * through the appropriate class loader.     */    Type returnType() throws ClassNotLoadedException;     /**     * Returns a list containing a text representation of the type     * of each formal parameter of this method.     * <P>     * This list is always available even if     * the types have not yet been created or loaded.     *     * @return a {@link java.util.List List} of {@link String},     * one List element for each parameter of this method.     * Each element represents the type of a formal parameter     * as specified at compile-time.     * If the formal parameter was declared with an ellipsis, then     * it is represented as an array of the type before the ellipsis.     *     */    List<String> argumentTypeNames();     /**     * Returns a list containing the type     * of each formal parameter of this method.     * <P>     * Note: if there is any parameter whose type     * is a reference type (class, interface, or array)     * and it has not been created or loaded     * by the declaring type's class loader - that is,     * {@link TypeComponent#declaringType <CODE>declaringType()</CODE>}     * <CODE>.classLoader()</CODE>,     * then ClassNotLoadedException will be thrown.     * Also, a reference type may have been loaded but not yet prepared,     * in which case the list will be returned     * but attempts to perform some operations on the type     * (e.g. {@link ReferenceType#fields() fields()}) will throw     * a {@link ClassNotPreparedException}.     * Use {@link ReferenceType#isPrepared()} to determine if     * a reference type is prepared.     *     * @see Type     * @return return a {@link java.util.List List} of {@link Type},     * one List element for each parameter of this method.     * Each element represents the type of a formal parameter     * as specified at compile-time.     * If the formal parameter was declared with an ellipsis, then     * it is represented as an array of the type before the ellipsis.     *     * @throws ClassNotLoadedException if the type has not yet been loaded     * through the appropriate class loader.     */    List<Type> argumentTypes() throws ClassNotLoadedException;     /**     * Determine if this method is abstract.     *     * @return <code>true</code> if the method is declared abstract;     * false otherwise.     */    boolean isAbstract();     /**     * Determine if this method is synchronized.     *     * @return <code>true</code> if the method is declared synchronized;     * false otherwise.     */    boolean isSynchronized();     /**     * Determine if this method is native.     *     * @return <code>true</code> if the method is declared native;     * false otherwise.     */    boolean isNative();     /**     * Determine if this method accepts a variable number of arguments.     *     * @return <code>true</code> if the method accepts a variable number     * of arguments, false otherwise.     *     * @since 1.5     */    boolean isVarArgs();     /**     * Determine if this method is a bridge method. Bridge     * methods are defined in     * <cite>The Java&trade; Language Specification</cite>.     *     * @return <code>true</code> if the method is a bridge method,     * false otherwise.     *     * @since 1.5     */    boolean isBridge();     /**     * Determine if this method is a constructor.     *     * @return <code>true</code> if the method is a constructor;     * false otherwise.     */    boolean isConstructor();     /**     * Determine if this method is a static initializer.     *     * @return <code>true</code> if the method is a static initializer;     * false otherwise.     */    boolean isStaticInitializer();     /**     * Determine if this method is obsolete.     *     * @return <code>true</code> if this method has been made obsolete by a     * {@link VirtualMachine#redefineClasses} operation.     *     * @since 1.4     */    boolean isObsolete();     /**     * Returns a list containing a {@link Location} object for     * each executable source line in this method.     * <P>     * This method is equivalent to     * <code>allLineLocations(vm.getDefaultStratum(),null)</code> -     * see {@link #allLineLocations(String,String)}     * for more information.     *     * @return a List of all source line {@link Location} objects.     *     * @throws AbsentInformationException if there is no line     * number information for this (non-native, non-abstract)     * method.     */    List<Location> allLineLocations() throws AbsentInformationException;     /**     * Returns a list containing a {@link Location} object for     * each executable source line in this method.     * <P>     * Each location maps a source line to a range of code     * indices.     * The beginning of the range can be determined through     * {@link Location#codeIndex}.     * The returned list is ordered by code index     * (from low to high).     * <P>     * The returned list may contain multiple locations for a     * particular line number, if the compiler and/or VM has     * mapped that line to two or more disjoint code index ranges.     * <P>     * If the method is native or abstract, an empty list is     * returned.     * <P>     * Returned list is for the specified <i>stratum</i>     * (see {@link Location} for a description of strata).     *     * @param stratum The stratum to retrieve information from     * or <code>null</code> for the {@link ReferenceType#defaultStratum()}     *     * @param sourceName Return locations only within this     * source file or <code>null</code> to return locations.     *     * @return a List of all source line {@link Location} objects.     *     * @throws AbsentInformationException if there is no line     * number information for this (non-native, non-abstract)     * method.  Or if <i>sourceName</i> is non-<code>null</code>     * and source name information is not present.     *     * @since 1.4     */    List<Location> allLineLocations(String stratum, String sourceName)        throws AbsentInformationException;     /**     * Returns a List containing all {@link Location} objects     * that map to the given line number.     * <P>     * This method is equivalent to     * <code>locationsOfLine(vm.getDefaultStratum(), null,     * lineNumber)</code> -     * see {@link     * #locationsOfLine(java.lang.String,java.lang.String,int)}     * for more information.     *     * @param lineNumber the line number     *     * @return a List of {@link Location} objects that map to     * the given line number.     *     * @throws AbsentInformationException if there is no line     * number information for this method.     */    List<Location> locationsOfLine(int lineNumber) throws AbsentInformationException;     /**     * Returns a List containing all {@link Location} objects     * that map to the given line number and source name.     * <P>     * Returns a list containing each {@link Location} that maps     * to the given line. The returned list will contain a     * location for each disjoint range of code indices that have     * been assigned to the given line by the compiler and/or     * VM. Each returned location corresponds to the beginning of     * this range.  An empty list will be returned if there is no     * executable code at the specified line number; specifically,     * native and abstract methods will always return an empty     * list.     * <p>     * Returned list is for the specified <i>stratum</i>     * (see {@link Location} for a description of strata).     *     * @param stratum the stratum to use for comparing line number     *                and source name, or null to use the default     *                stratum     * @param sourceName the source name containing the     *                   line number, or null to match all     *                   source names     * @param lineNumber the line number     *     * @return a List of {@link Location} objects that map to     * the given line number.     *     * @throws AbsentInformationException if there is no line     * number information for this method.     * Or if <i>sourceName</i> is non-<code>null</code>     * and source name information is not present.     *     * @since 1.4     */    List<Location> locationsOfLine(String stratum, String sourceName,                                   int lineNumber)        throws AbsentInformationException;     /**     * Returns a {@link Location} for the given code index.     *     * @return the {@link Location} corresponding to the     * given code index or null if the specified code index is not a     * valid code index for this method (native and abstract methods     * will always return null).     */    Location locationOfCodeIndex(long codeIndex);     /**     * Returns a list containing each {@link LocalVariable} declared     * in this method. The list includes any variable declared in any     * scope within the method. It may contain multiple variables of the     * same name declared within disjoint scopes. Arguments are considered     * local variables and will be present in the returned list.     *     * If local variable information is not available, values of     * actual arguments to method invocations can be obtained     * by using the method {@link StackFrame#getArgumentValues()}     *     * @return the list of {@link LocalVariable} objects which mirror     * local variables declared in this method in the target VM.     * If there are no local variables, a zero-length list is returned.     * @throws AbsentInformationException if there is no variable     * information for this method.     * Generally, local variable information is not available for     * native or abstract methods (that is, their argument name     * information is not available), thus they will throw this exception.     */    List<LocalVariable> variables() throws AbsentInformationException;     /**     * Returns a list containing each {@link LocalVariable} of a     * given name in this method.     * Multiple variables can be returned     * if the same variable name is used in disjoint     * scopes within the method.     *     * @return the list of {@link LocalVariable} objects of the given     * name.     * If there are no matching local variables, a zero-length list     * is returned.     * @throws AbsentInformationException if there is no variable     * information for this method.     * Generally, local variable information is not available for     * native or abstract methods (that is, their argument name     * information is not available), thus they will throw this exception.     */    List<LocalVariable> variablesByName(String name)        throws AbsentInformationException;     /**     * Returns a list containing each {@link LocalVariable} that is     * declared as an argument of this method.     *     * If local variable information is not available, values of     * actual arguments to method invocations can be obtained     * by using the method {@link StackFrame#getArgumentValues()}     *     * @return the list of {@link LocalVariable} arguments.     * If there are no arguments, a zero-length list is returned.     * @throws AbsentInformationException if there is no variable     * information for this method.     * Generally, local variable information is not available for     * native or abstract methods (that is, their argument name     * information is not available), thus they will throw this exception.     */    List<LocalVariable> arguments() throws AbsentInformationException;     /**     * Returns an array containing the bytecodes for this method.     * <P>     * Not all target virtual machines support this operation.     * Use {@link VirtualMachine#canGetBytecodes()}     * to determine if the operation is supported.     *     * @return the array of bytecodes; abstract and native methods     * will return a zero-length array.     * @throws java.lang.UnsupportedOperationException if     * the target virtual machine does not support     * the retrieval of bytecodes.     */    byte[] bytecodes();     /**     * Returns the {@link Location} of this method, if there     * is executable code associated with it.     *     * @return the {@link Location} of this mirror, or null if     * this is an abstract method; native methods will return a     * Location object whose codeIndex is -1.     */    Location location();     /**     * Compares the specified Object with this method for equality.     *     * @return true if the Object is a method and if both     * mirror the same method (declared in the same class or interface, in     * the same VM).     */    boolean equals(Object obj);     /**     * Returns the hash code value for this Method.     *     * @return the integer hash code     */    int hashCode();}