模块 java.base

类 Method

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

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

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

自从:
1.1
参见:
  • 方法详情

    • setAccessible

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

      如果以下任何一项成立,则类 C 中的调用者可以使用此方法来启用对 declaring class Dmember 的访问:

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

      当且仅当:

      • 成员是publicDpublic,模块无条件包含D exports

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

      此方法不能用于启用 write non-modifiable final 字段的访问。以下字段是不可修改的:

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

      true 时的 accessible 标志抑制 Java 语言访问控制检查以仅启用 read 对这些不可修改的最终字段的访问。

      如果有安全管理器,它的 checkPermission 方法将首先以 ReflectPermission("suppressAccessChecks") 权限调用。

      重写:
      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 语言 modifiers
      指定者:
      getModifiers 在接口 Member
      指定者:
      getModifiers 在类 Executable
      返回:
      此对象表示的可执行文件的 Java 语言 modifiers
      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
      返回:
      表示底层可执行文件抛出的异常类型的 Types 数组
      抛出:
      GenericSignatureFormatError - 如果泛型方法签名不符合指定的格式Java 虚拟机规范
      TypeNotPresentException - 如果底层可执行文件的 throws 子句引用不存在的类型声明
      MalformedParameterizedTypeException - 如果底层可执行文件的 throws 子句引用了由于任何原因无法实例化的参数化类型
      自从:
      1.5
    • equals

      public boolean equals(Object  obj)
      将此 Method 与指定对象进行比较。如果对象相同,则返回 true。如果两个 Methods 由同一个类声明并且具有相同的名称、形参类型和返回类型,则它们是相同的。
      重写:
      equals 在类 Object
      参数:
      obj - 要比较的参考对象。
      返回:
      true 如果此对象与 obj 参数相同; 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
    • invoke

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

      如果底层方法是静态的,则忽略指定的 obj 参数。它可能为空。

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

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

      如果底层方法是静态的,则声明该方法的类在尚未初始化的情况下被初始化。

      如果方法正常完成,它返回的值返回给invoke的调用者;如果该值具有原始类型,则首先将其适当地包装在一个对象中。但是,如果该值具有原始类型数组的类型,则数组的元素是not包裹在物体中;换句话说,返回一个原始类型的数组。如果底层方法返回类型为 void,则调用返回 null。

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

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

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

      protected Object clone() throws CloneNotSupportedException {...} 
      EnumSet<E> 声明其语言级别 协变覆盖
      public EnumSet<E> clone() {...} 
      如果使用此技术,EnumSet 的结果类文件将有两个 clone 方法,一个返回 EnumSet<E>,第二个返回 Object 的桥接方法。桥接方法是 Object.clone() 的 JVM 级覆盖。 clone bridge 方法的主体调用其对应的非桥接方法并返回其结果。
      返回:
      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 语言规范.
      Java 语言规范:
      13.1 二进制形式
      Java 虚拟机规范:
      4.6 方法
      自从:
      1.5
      参见:
    • isDefault

      public boolean isDefault()
      如果此方法是默认方法,则返回 true;否则返回 false。默认方法是公共非抽象实例方法,即具有主体的非静态方法,在接口中声明。
      返回:
      当且仅当此方法是 Java 语言规范定义的默认方法时才为真。
      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)
      如果此类注解为 present ,则返回此元素针对指定类型的注解,否则为 null。

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

      指定者:
      getAnnotation 在接口 AnnotatedElement
      重写:
      getAnnotation 在类 Executable
      类型参数:
      T - 要查询并返回的注释类型(如果存在)
      参数:
      annotationClass——注解类型对应的Class对象
      返回:
      如果此元素上存在此元素的指定注解类型的注解,则为 null
      抛出:
      NullPointerException - 如果给定的注释类为 null
      自从:
      1.5
    • getDeclaredAnnotations

      public Annotation [] getDeclaredAnnotations()
      返回此元素上的 directly present 注释。此方法忽略继承的注释。如果该元素上没有注解directly present,则返回值为长度为0的数组。该方法的调用者可以自由修改返回的数组;它不会影响返回给其他调用者的数组。

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

      指定者:
      getDeclaredAnnotations 在接口 AnnotatedElement
      重写:
      getDeclaredAnnotations 在类 AccessibleObject
      返回:
      注释直接出现在这个元素上
      自从:
      1.5
    • getParameterAnnotations

      public Annotation [][] getParameterAnnotations()
      返回 Annotation 数组的数组,这些数组表示形式参数上的注释,按声明顺序,由该对象表示的 Executable 。合成参数和强制参数(参见下面的解释),例如内部类构造函数的外部“this”参数将在返回的数组中表示。如果可执行文件没有参数(意味着没有正式的、没有综合的、没有强制的参数),将返回一个零长度数组。如果 Executable 有一个或多个参数,则为每个没有注释的参数返回一个长度为零的嵌套数组。返回数组中包含的注释对象是可序列化的。该方法的调用者可以自由修改返回的数组;它不会影响返回给其他调用者的数组。编译器可能会在方法的参数列表中添加在源代码中隐式声明的额外参数(“强制”),以及在源代码中既没有隐式声明也没有显式声明的参数(“合成”)。有关详细信息,请参阅 Parameter

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

      指定者:
      getParameterAnnotations 在类 Executable
      返回:
      一个数组数组,表示此对象表示的可执行文件的形式参数和隐式参数的注释,按声明顺序排列
      自从:
      1.5
      参见:
    • getAnnotatedReturnType

      public AnnotatedType  getAnnotatedReturnType()
      返回一个 AnnotatedType 对象,该对象表示使用一种类型来指定此可执行文件表示的方法/构造函数的返回类型。如果这个 Executable 对象表示构造函数,那么 AnnotatedType 对象表示构造对象的类型。如果这个Executable对象代表一个方法,那么 AnnotatedType对象代表使用一个类型来指定方法的返回类型。
      指定者:
      getAnnotatedReturnType 在类 Executable
      返回:
      表示此 Executable 表示的方法或构造函数的返回类型的对象
      自从:
      1.8