Module java.base

Class Method

所有已实现的接口:
AnnotatedElement, GenericDeclaration, Member

public final class Method extends Executable
一个Method提供了关于类或接口上的单个方法的信息和访问权限。反射方法可以是类方法或实例方法(包括抽象方法)。

Method允许在匹配要调用的实际参数与基础方法的形式参数时发生扩展转换,但如果发生缩小转换,则会抛出IllegalArgumentException

自:
1.1
参见:
  • Method Details

    • setAccessible

      public void setAccessible(boolean flag)
      从类中复制的描述: AccessibleObject
      将此反射对象的accessible标志设置为指定的布尔值。值为true表示在使用时应该抑制对Java语言访问控制的检查。值为false表示在使用时应该强制执行Java语言访问控制的检查,注意类描述中指出的变化。

      调用者在类C中可以使用此方法,以启用对声明类 D成员的访问,如果满足以下任何条件:

      • CD在同一模块中。
      • 成员是public的,D在将D包含的模块导出到至少包含C的模块。
      • 成员是protected static的,D在将D包含的模块导出到至少包含C的模块,并且CD的子类。
      • D在将D包含的模块打开到至少包含C的模块。未命名和打开模块中的所有包都对所有模块开放,因此当D在未命名或打开模块中时,此方法总是成功的。

      JNI代码可以使用此方法,如果满足以下条件,且调用栈上没有调用者类,则可以启用对声明类 D成员的访问:

      此方法不能用于启用对私有成员、具有默认(包)访问权限的成员、受保护的实例成员或受保护的构造函数的访问,当声明类与调用者的模块不同且包含声明类的包对调用者的模块不开放时。

      此方法不能用于启用对非可修改最终字段的访问。以下字段是不可修改的:

      • 在任何类或接口中声明的静态最终字段
      • 隐藏类中声明的最终字段
      • 记录中声明的最终字段

      true时,accessible标志会抑制Java语言访问控制检查,仅允许对这些不可修改的最终字段进行访问。

      如果存在安全管理器,则首先使用ReflectPermission("suppressAccessChecks")权限调用其checkPermission方法。

      覆盖:
      setAccessible 在类 AccessibleObject
      参数:
      flag - accessible标志的新值
      抛出:
      InaccessibleObjectException - 如果无法启用访问权限
      SecurityException - 如果安全管理器拒绝请求
      外部规范
      参见:
    • getDeclaringClass

      public Class<?> getDeclaringClass()
      返回表示由此对象表示的方法的类或接口的Class对象。
      指定者:
      getDeclaringClass 在接口 Member
      指定者:
      getDeclaringClass 在类 Executable
      返回:
      表示底层成员的声明类的对象
    • getName

      public String getName()
      返回由此Method对象表示的方法的名称,作为String
      指定由:
      getName 在接口 Member
      指定由:
      getName 在类 Executable
      返回:
      底层成员的简单名称
    • getModifiers

      public int getModifiers()
      返回此对象表示的可执行对象的Java语言修饰符
      指定由:
      getModifiers 在接口 Member
      指定由:
      getModifiers 在类 Executable
      返回:
      此对象表示的可执行对象的Java语言修饰符
      参见 Java语言规范:
      8.4.3 方法修饰符
      另请参阅:
    • getTypeParameters

      public TypeVariable<Method>[] getTypeParameters()
      返回一个TypeVariable对象数组,表示此GenericDeclaration对象声明的泛型声明中声明的类型变量,按声明顺序排列。如果底层泛型声明不声明类型变量,则返回长度为0的数组。
      指定由:
      getTypeParameters 在接口 GenericDeclaration
      指定由:
      getTypeParameters 在类 Executable
      返回:
      一个TypeVariable对象数组,表示此泛型声明声明的类型变量
      抛出:
      GenericSignatureFormatError - 如果此泛型声明的泛型签名不符合Java虚拟机规范中指定的格式
      参见 Java语言规范:
      8.4.4 泛型方法
      自:
      1.5
    • getReturnType

      public Class<?> getReturnType()
      返回一个Class对象,表示此Method对象表示的方法的形式返回类型。
      返回:
      此对象表示的方法的返回类型
    • getGenericReturnType

      public Type getGenericReturnType()
      返回一个Type对象,表示此Method对象表示的方法的形式返回类型。

      如果返回类型是参数化类型,则返回的Type对象必须准确反映源代码中使用的实际类型参数。

      如果返回类型是类型变量或参数化类型,则会创建它。否则,它会被解析。

      返回:
      一个Type对象,表示底层方法的形式返回类型
      抛出:
      GenericSignatureFormatError - 如果泛型方法签名不符合Java虚拟机规范中指定的格式
      TypeNotPresentException - 如果底层方法的返回类型引用不存在的类或接口声明
      MalformedParameterizedTypeException - 如果底层方法的返回类型引用无法由于任何原因实例化的参数化类型
      自:
      1.5
    • getParameterTypes

      public Class<?>[] getParameterTypes()
      返回一个Class对象数组,表示此对象表示的可执行对象的形式参数类型,按声明顺序排列。如果底层可执行对象不带参数,则返回长度为0的数组。请注意,一些内部类的构造函数可能除了显式声明的参数外还具有隐式声明的参数。
      指定由:
      getParameterTypes 在类 Executable
      返回:
      此对象表示的可执行对象的参数类型
    • getParameterCount

      public int getParameterCount()
      返回此对象表示的可执行对象的形式参数数量(无论是显式声明的、隐式声明的还是两者都不是)。
      指定由:
      getParameterCount 在类 Executable
      返回:
      此对象表示的可执行对象的形式参数数量
      自:
      1.8
    • getGenericParameterTypes

      public Type[] getGenericParameterTypes()
      返回一个Type对象数组,表示此对象表示的可执行对象的形式参数类型,按声明顺序排列。如果底层可执行对象不带参数,则返回长度为0的数组。请注意,一些内部类的构造函数可能除了显式声明的参数外还具有隐式声明的参数。还请注意,作为建模工件,返回的参数数量可能会因是否存在泛型信息而有所不同。如果存在泛型信息,则只返回源代码中明确存在的参数;如果不存在泛型信息,则可能还会返回隐式和合成参数。

      如果形式参数类型是参数化类型,则为其返回的Type对象必须准确反映源代码中使用的实际类型参数。

      如果形式参数类型是类型变量或参数化类型,则会创建它。否则,它会被解析。

      覆盖:
      getGenericParameterTypes 在类 Executable
      返回:
      一个表示底层可执行对象的形式参数类型的Type对象数组,按声明顺序排列
      抛出:
      GenericSignatureFormatError - 如果泛型方法签名不符合Java虚拟机规范中指定的格式
      TypeNotPresentException - 如果底层可执行对象的任何形式参数引用不存在的类型声明
      MalformedParameterizedTypeException - 如果底层可执行对象的形式参数引用无法由于任何原因实例化的参数化类型
      自:
      1.5
    • getExceptionTypes

      public Class<?>[] getExceptionTypes()
      返回一个Class对象数组,表示此对象表示的底层可执行对象声明要抛出的异常类型。如果可执行对象在其throws子句中未声明异常,则返回长度为0的数组。
      指定由:
      getExceptionTypes 在类 Executable
      返回:
      此对象表示的可执行对象声明要抛出的异常类型
    • getGenericExceptionTypes

      public Type[] getGenericExceptionTypes()
      返回一个Type对象数组,表示此可执行对象声明要抛出的异常类型。如果底层可执行对象在其throws子句中未声明异常,则返回长度为0的数组。

      如果异常类型是类型变量或参数化类型,则会创建它。否则,它会被解析。

      覆盖:
      getGenericExceptionTypes 在类 Executable
      返回:
      一个表示底层可执行对象抛出的异常类型的Type对象数组
      抛出:
      GenericSignatureFormatError - 如果泛型方法签名不符合Java虚拟机规范中指定的格式
      TypeNotPresentException - 如果底层可执行对象的throws子句引用不存在的类型声明
      MalformedParameterizedTypeException - 如果底层可执行对象的throws子句引用无法由于任何原因实例化的参数化类型
      自:
      1.5
    • equals

      public boolean equals(Object obj)
      将此Method与指定对象进行比较。如果对象相同,则返回true。如果两个Method由同一类声明并具有相同的名称、形式参数类型和返回类型,则它们相同。
      覆盖:
      equals 在类 Object
      参数:
      obj - 用于比较的参考对象。
      返回:
      如果此对象与obj参数相同,则返回true; 否则返回false
      参见:
    • hashCode

      public int hashCode()
      返回此Method的哈希码。哈希码计算为基础方法声明类名的哈希码与方法名称的异或结果。
      覆盖:
      hashCode 在类 Object
      返回:
      此对象的哈希码值。
      参见:
    • toString

      public String toString()
      返回描述此Method的字符串。字符串格式为方法访问修饰符(如果有),后跟方法返回类型,后跟一个空格,后跟声明方法的类,后跟一个句点,后跟方法名称,后跟方法的形式参数类型的括号,以逗号分隔。如果方法抛出已检查的异常,则参数列表后跟一个空格,后跟单词"throws",后跟一个逗号分隔的抛出异常类型列表。例如:
          public boolean java.lang.Object.equals(java.lang.Object)
       

      访问修饰符按照《Java语言规范》指定的规范顺序放置。这是首先publicprotectedprivate,然后按照以下顺序放置其他修饰符:abstractdefaultstaticfinalsynchronizednativestrictfp

      覆盖:
      toString 在类 Object
      返回:
      描述此Method的字符串
      参见Java语言规范:
      8.4.3 方法修饰符
      9.4 方法声明
      9.6.1 注解接口元素
    • toGenericString

      public String toGenericString()
      返回描述此Method的字符串,包括类型参数。字符串格式为方法访问修饰符(如果有),后跟一个尖括号分隔的逗号分隔的方法类型参数列表(如果有),包括类型参数的信息性边界(如果有),后跟方法的通用返回类型,后跟一个空格,后跟声明方法的类,后跟一个句点,后跟方法名称,后跟方法的通用形式参数类型的括号,以逗号分隔。如果此方法声明为接受可变数量的参数,则最后一个参数不是"Type[]",而是"Type..."。访问修饰符之间和与类型参数或返回类型之间使用空格分隔。如果没有类型参数,则省略类型参数列表;如果存在类型参数列表,则空格将列表与类名分隔。如果方法声明抛出异常,则参数列表后跟一个空格,后跟单词"throws",后跟一个逗号分隔的通用抛出异常类型列表。

      访问修饰符按照《Java语言规范》指定的规范顺序放置。这是首先publicprotectedprivate,然后按照以下顺序放置其他修饰符:abstractdefaultstaticfinalsynchronizednativestrictfp

      指定者:
      toGenericString 在类 Executable
      返回:
      描述此Method的字符串,包括类型参数
      参见Java语言规范:
      8.4.3 方法修饰符
      9.4 方法声明
      9.6.1 注解接口元素
      自1.5起:
      1.5
    • invoke

      public Object invoke(Object obj, Object... args) throws IllegalAccessException, InvocationTargetException
      调用由此Method对象表示的基础方法,使用指定对象和指定参数。各个参数将自动解包以匹配原始形式参数,并且原始和引用参数都将根据需要进行方法调用转换。

      如果基础方法是静态的,则忽略指定的obj参数。它可以为null。

      如果基础方法所需的形式参数数量为0,则提供的args数组可以长度为0或为null。

      如果基础方法是实例方法,则将使用动态方法查找调用它,如《Java语言规范》第15.12.4.4节所述;特别是,基于目标对象的运行时类型可能会发生覆盖。

      如果基础方法是静态的,则声明方法的类将在尚未初始化的情况下进行初始化。

      如果方法正常完成,则返回其返回值给调用者; 如果值具有原始类型,则首先将其适当地包装在对象中。但是,如果值具有原始类型的数组类型,则数组的元素不会被包装在对象中;换句话说,将返回原始类型的数组。如果基础方法的返回类型为void,则调用返回null。

      参数:
      obj - 调用基础方法的对象
      args - 用于方法调用的参数
      返回:
      obj上调度此对象表示的方法的结果,参数为args
      抛出:
      IllegalAccessException - 如果此Method对象正在执行Java语言访问控制并且基础方法不可访问。
      IllegalArgumentException - 如果方法是实例方法且指定的对象参数不是声明基础方法的类或接口(或其子类或实现者)的实例;如果实际参数和形式参数的数量不同;如果原始参数的解包转换失败;或者如果在可能的解包后,参数值无法通过方法调用转换转换为相应的形式参数类型。
      InvocationTargetException - 如果基础方法引发异常。
      NullPointerException - 如果指定的对象为null且方法是实例方法。
      ExceptionInInitializerError - 如果此方法引发的初始化失败。
    • isBridge

      public boolean isBridge()
      如果此方法是桥接方法,则返回true; 否则返回false
      API注释:
      桥接方法是Java编译器在源代码中的方法旁边创建的合成方法。桥接方法在各种情况下由Java编译器使用,以弥合Java编程语言语义和JVM语义之间的差异。

      桥接方法的一个示例用途是作为Java编译器支持协变覆盖的技术,其中子类覆盖一个方法并为新方法提供比超类中方法更具体的返回类型。虽然Java语言规范禁止一个类声明具有相同参数类型但返回类型不同的两个方法,但虚拟机不会。协变覆盖经常用于Cloneable类的情况,其中从java.lang.Object继承的clone方法被覆盖并声明为返回类的类型。例如,Object声明

      protected Object clone() throws CloneNotSupportedException {...}
      EnumSet<E>声明其语言级别的协变覆盖
      public EnumSet<E> clone() {...}
      如果正在使用此技术,则EnumSet的类文件将具有两个clone方法,一个返回EnumSet<E>,另一个是返回Object的桥接方法。桥接方法是Object.clone()的JVM级别覆盖。桥接方法的主体调用其非桥接对应方法并返回其结果。
      返回:
      如果此方法是桥接方法,则返回true;否则返回false
      参见Java语言规范:
      8.4.8.3 覆盖和隐藏的要求
      15.12.4.5 创建帧,同步,传输控制
      参见Java虚拟机规范:
      4.6 方法
      自版本:
      1.5
      另请参见:
    • isVarArgs

      public boolean isVarArgs()
      如果此可执行程序声明为接受可变数量的参数,则返回true;否则返回false
      覆盖:
      isVarArgs 在类 Executable
      返回:
      如果此可执行程序声明为接受可变数量的参数,则返回true;否则返回false
      参见Java语言规范:
      8.4.1 形式参数
      自版本:
      1.5
    • isSynthetic

      public boolean isSynthetic()
      如果此可执行程序是合成构造,则返回true;否则返回false
      指定者:
      isSynthetic 在接口 Member
      覆盖:
      isSynthetic 在类 Executable
      返回:
      如果此可执行程序是由Java语言规范定义的合成构造,则返回true。
      参见Java语言规范:
      13.1 二进制形式
      参见Java虚拟机规范:
      4.6 方法
      自版本:
      1.5
      另请参见:
    • isDefault

      public boolean isDefault()
      如果此方法是默认方法,则返回true;否则返回false。默认方法是一个公共的非抽象实例方法,即一个具有主体的非静态方法,在接口中声明。
      返回:
      如果此方法是由Java语言规范定义的默认方法,则返回true。
      参见Java语言规范:
      9.4 方法声明
      自版本:
      1.8
    • getDefaultValue

      public Object getDefaultValue()
      返回此Method实例表示的注解成员的默认值。如果成员是原始类型,则返回相应包装类型的实例。如果成员没有关联默认值,或者方法实例不表示注解类型的已声明成员,则返回null。
      返回:
      表示此Method实例的注解成员的默认值。
      抛出:
      TypeNotPresentException - 如果注解是Class类型且找不到默认类值的定义。
      参见Java语言规范:
      9.6.2 注解类型元素的默认值
      自版本:
      1.5
    • getAnnotation

      public <T extends Annotation> T getAnnotation(Class<T> annotationClass)
      如果指定类型的注解对此元素存在,则返回该元素的注解;否则返回null。

      请注意,此方法返回的任何注解都是声明注解。

      指定者:
      getAnnotation 在接口 AnnotatedElement
      覆盖:
      getAnnotation 在类 Executable
      类型参数:
      T - 要查询并返回的注解类型
      参数:
      annotationClass - 对应于注解类型的Class对象
      返回:
      如果此元素上存在指定注解类型的注解,则返回该元素的注解,否则返回null
      抛出:
      NullPointerException - 如果给定的注解类为null
      自版本:
      1.5
    • getDeclaredAnnotations

      public Annotation[] getDeclaredAnnotations()
      返回直接存在于此元素上的注解。此方法忽略继承的注解。如果此元素上没有直接存在的注解,则返回长度为0的数组。调用此方法的调用者可以修改返回的数组;这不会影响返回给其他调用者的数组。

      请注意,此方法返回的任何注解都是声明注解。

      指定者:
      getDeclaredAnnotations 在接口 AnnotatedElement
      覆盖:
      getDeclaredAnnotations 在类 AccessibleObject
      返回:
      直接存在于此元素上的注解
      自版本:
      1.5
    • getParameterAnnotations

      public Annotation[][] getParameterAnnotations()
      返回一个Executable对象表示的方法/构造函数的返回类型的类型使用。如果此Executable对象表示构造函数,则AnnotatedType对象表示构造对象的类型。如果此Executable对象表示方法,则AnnotatedType对象表示使用类型来指定方法的返回类型。
      Specified by:
      getParameterAnnotations in class Executable
      Returns:
      an array of arrays that represent the annotations on the formal and implicit parameters, in declaration order, of the executable represented by this object
      Since:
      1.5
      See Also:
    • getAnnotatedReturnType

      public AnnotatedType getAnnotatedReturnType()
      Returns an AnnotatedType object that represents the use of a type to specify the return type of the method/constructor represented by this Executable. If this Executable object represents a constructor, the AnnotatedType object represents the type of the constructed object. If this Executable object represents a method, the AnnotatedType object represents the use of a type to specify the return type of the method.
      指定者:
      getAnnotatedReturnType 在类 Executable
      返回:
      表示由此Executable所代表的方法或构造函数的返回类型的对象
      自版本:
      1.8