- 所有已实现的接口:
AnnotatedElement
,GenericDeclaration
,Member
Method
提供有关类或接口上的单个方法的信息和访问权限。被反射的方法可以是类方法,也可以是实例方法(包括抽象方法)。
Method
允许在将要调用的实际参数与基础方法的形式参数匹配时发生扩大转换,但如果发生缩小转换,它会抛出 IllegalArgumentException
。
- 自从:
- 1.1
- 参见:
-
字段摘要
-
方法总结
修饰符和类型方法描述boolean
将此Method
与指定对象进行比较。返回一个AnnotatedType
对象,该对象表示使用一种类型来指定此可执行文件表示的方法/构造函数的返回类型。<T extends Annotation>
TgetAnnotation
(Class<T> annotationClass) 如果此类注解为 present ,则返回此元素针对指定类型的注解,否则为 null。返回此元素上的 directly present 注释。Class<?>
返回表示声明此对象表示的方法的类或接口的Class
对象。返回此Method
实例表示的注解成员的默认值。Class<?>[]
返回一个Class
对象数组,这些对象表示声明由该对象表示的底层可执行文件抛出的异常类型。Type[]
返回一个Type
对象数组,这些对象表示声明将由此可执行对象抛出的异常。Type[]
返回一个Type
对象数组,这些对象按声明顺序表示此对象表示的可执行文件的形式参数类型。返回一个Type
对象,该对象表示此Method
对象所表示的方法的正式返回类型。int
返回此对象表示的可执行文件的 Java 语言 modifiers。getName()
返回此Method
对象表示的方法的名称,作为String
。Annotation[][]
返回Annotation
数组的数组,这些数组表示形式参数上的注释,按声明顺序,由该对象表示的Executable
。int
返回此对象表示的可执行文件的形式参数(无论是显式声明还是隐式声明或两者都不是)的数量。Class<?>[]
返回一个Class
对象数组,这些对象按声明顺序表示此对象表示的可执行文件的形式参数类型。Class<?>
返回一个Class
对象,该对象表示此Method
对象所表示的方法的正式返回类型。返回一个TypeVariable
对象数组,这些对象表示由此GenericDeclaration
对象表示的泛型声明所声明的类型变量,按声明顺序排列。int
hashCode()
返回此Method
的哈希码。在具有指定参数的指定对象上调用此Method
对象表示的基础方法。boolean
isBridge()
如果此方法是桥接方法,则返回true
;否则返回false
。boolean
如果此方法是默认方法,则返回true
;否则返回false
。boolean
如果此可执行文件是合成构造,则返回true
;否则返回false
。boolean
如果此可执行文件被声明为采用可变数量的参数,则返回true
;否则返回false
。void
setAccessible
(boolean flag) 将此反射对象的accessible
标志设置为指示的boolean。返回描述此Method
的字符串,包括类型参数。toString()
返回描述此Method
的字符串。在类 java.lang.reflect.Executable 中声明的方法
accessFlags, getAnnotatedExceptionTypes, getAnnotatedParameterTypes, getAnnotatedReceiverType, getAnnotationsByType, getParameters
在类 java.lang.reflect.AccessibleObject 中声明的方法
canAccess, getAnnotations, getDeclaredAnnotation, getDeclaredAnnotationsByType, isAccessible, isAnnotationPresent, setAccessible, trySetAccessible
在接口 java.lang.reflect.AnnotatedElement 中声明的方法
getAnnotations, getDeclaredAnnotation, getDeclaredAnnotationsByType, isAnnotationPresent
-
方法详情
-
setAccessible
public void setAccessible(boolean flag) 从类复制的描述:AccessibleObject
将此反射对象的accessible
标志设置为指示的boolean。值true
表示反射对象在使用时应禁止检查 Java 语言访问控制。值false
表示反射对象在使用时应强制检查 Java 语言访问控制,并在类描述中注明变化。如果以下任何一项成立,则类
C
中的调用者可以使用此方法来启用对declaring class
D
的member
的访问:C
和D
在同一模块中。- 成员是
public
和D
是public
在一个包中,模块包含D
exports
到至少包含C
的模块。 - 成员是
protected
static
,D
是包中的public
,包含D
的模块导出到至少包含C
的模块,而C
是D
的子类。 D
在包含D
opens
的模块到至少包含C
的模块的包中。未命名和开放模块中的所有包都对所有模块开放,因此当D
在未命名或开放模块中时,此方法总是成功。
当且仅当:
- 成员是
public
,D
是public
,模块无条件包含D
exports
。
当声明类与调用者位于不同的模块中并且包含声明类的包未向其开放时,此方法不能用于启用对私有成员、具有默认(包)访问权限的成员、受保护实例成员或受保护构造方法的访问调用者的模块。
此方法不能用于启用 write 对 non-modifiable final 字段的访问。以下字段是不可修改的:
true
时的accessible
标志抑制 Java 语言访问控制检查以仅启用 read 对这些不可修改的最终字段的访问。如果有安全管理器,它的
checkPermission
方法将首先以ReflectPermission("suppressAccessChecks")
权限调用。- 重写:
setAccessible
在类AccessibleObject
中- 参数:
flag
-accessible
标志的新值- 抛出:
InaccessibleObjectException
- 如果无法启用访问SecurityException
- 如果请求被安全管理器拒绝- 参见:
-
getDeclaringClass
返回表示声明此对象表示的方法的类或接口的Class
对象。- 指定者:
getDeclaringClass
在接口Member
中- 指定者:
getDeclaringClass
在类Executable
中- 返回:
- 表示底层成员的声明类的对象
-
getName
返回此Method
对象表示的方法的名称,作为String
。- 指定者:
getName
在接口Member
中- 指定者:
getName
在类Executable
中- 返回:
- 基础成员的简单名称
-
getModifiers
public int getModifiers()返回此对象表示的可执行文件的 Java 语言 modifiers。- 指定者:
getModifiers
在接口Member
中- 指定者:
getModifiers
在类Executable
中- 返回:
- 此对象表示的可执行文件的 Java 语言 modifiers
- 看Java 语言规范:
-
8.4.3 方法修饰符
- 参见:
-
getTypeParameters
返回一个TypeVariable
对象数组,这些对象表示由此GenericDeclaration
对象表示的泛型声明所声明的类型变量,按声明顺序排列。如果基础泛型声明未声明类型变量,则返回长度为 0 的数组。- 指定者:
getTypeParameters
在接口GenericDeclaration
中- 指定者:
getTypeParameters
在类Executable
中- 返回:
-
一个
TypeVariable
对象数组,表示此泛型声明所声明的类型变量 - 抛出:
GenericSignatureFormatError
- 如果此通用声明的通用签名不符合中指定的格式Java 虚拟机规范- 看Java 语言规范:
-
8.4.4 通用方法
- 自从:
- 1.5
-
getReturnType
返回一个Class
对象,该对象表示此Method
对象所表示的方法的正式返回类型。- 返回:
- 此对象表示的方法的返回类型
-
getGenericReturnType
返回一个Type
对象,该对象表示此Method
对象所表示的方法的正式返回类型。如果返回类型是参数化类型,则返回的
Type
对象必须准确反映源代码中使用的实际类型参数。如果返回类型是类型变量或参数化类型,则创建它。否则,它被解决了。
- 返回:
-
代表底层方法的正式返回类型的
Type
对象 - 抛出:
GenericSignatureFormatError
- 如果泛型方法签名不符合指定的格式Java 虚拟机规范TypeNotPresentException
- 如果底层方法的返回类型引用了一个不存在的类或接口声明MalformedParameterizedTypeException
- 如果底层方法的返回类型引用了由于任何原因无法实例化的参数化类型- 自从:
- 1.5
-
getParameterTypes
返回一个Class
对象数组,这些对象按声明顺序表示此对象表示的可执行文件的形式参数类型。如果底层可执行文件不带参数,则返回长度为 0 的数组。请注意,某些内部类的构造函数除了显式声明的参数外,还可能具有隐式声明的参数。- 指定者:
getParameterTypes
在类Executable
中- 返回:
- 此对象表示的可执行文件的参数类型
-
getParameterCount
public int getParameterCount()返回此对象表示的可执行文件的形式参数(无论是显式声明还是隐式声明或两者都不是)的数量。- 指定者:
getParameterCount
在类Executable
中- 返回:
- 此对象表示的可执行文件的形参数量
- 自从:
- 1.8
-
getGenericParameterTypes
返回一个Type
对象数组,这些对象按声明顺序表示此对象表示的可执行文件的形式参数类型。如果底层可执行文件不带参数,则返回长度为 0 的数组。请注意,某些内部类的构造函数除了显式声明的参数外,还可能具有隐式声明的参数。另请注意,作为 建模神器 ,返回参数的数量可能会有所不同,具体取决于是否存在通用信息。如果存在通用信息,则仅返回源中明确存在的参数;如果不存在通用信息,则也可以返回隐式和合成参数。如果形式参数类型是参数化类型,则为其返回的
Type
对象必须准确反映源代码中使用的实际类型参数。如果形式参数类型是类型变量或参数化类型,则创建它。否则,它被解决了。
- 重写:
getGenericParameterTypes
在类Executable
中- 返回:
-
一个
Type
数组,表示底层可执行文件的形式参数类型,按声明顺序排列 - 抛出:
GenericSignatureFormatError
- 如果泛型方法签名不符合指定的格式Java 虚拟机规范TypeNotPresentException
- 如果底层可执行文件的任何参数类型引用不存在的类型声明MalformedParameterizedTypeException
- 如果任何底层可执行文件的参数类型引用了由于任何原因无法实例化的参数化类型- 自从:
- 1.5
-
getExceptionTypes
返回一个Class
对象数组,这些对象表示声明由该对象表示的底层可执行文件抛出的异常类型。如果可执行文件在其throws
子句中声明没有异常,则返回一个长度为 0 的数组。- 指定者:
getExceptionTypes
在类Executable
中- 返回:
- 声明为由此对象表示的可执行文件抛出的异常类型
-
getGenericExceptionTypes
返回一个Type
对象数组,这些对象表示声明将由此可执行对象抛出的异常。如果底层可执行文件在其throws
子句中声明没有异常,则返回一个长度为 0 的数组。如果异常类型是类型变量或参数化类型,则创建它。否则,它被解决了。
- 重写:
getGenericExceptionTypes
在类Executable
中- 返回:
- 表示底层可执行文件抛出的异常类型的 Types 数组
- 抛出:
GenericSignatureFormatError
- 如果泛型方法签名不符合指定的格式Java 虚拟机规范TypeNotPresentException
- 如果底层可执行文件的throws
子句引用不存在的类型声明MalformedParameterizedTypeException
- 如果底层可执行文件的throws
子句引用了由于任何原因无法实例化的参数化类型- 自从:
- 1.5
-
equals
将此Method
与指定对象进行比较。如果对象相同,则返回 true。如果两个Methods
由同一个类声明并且具有相同的名称、形参类型和返回类型,则它们是相同的。 -
hashCode
public int hashCode()返回此Method
的哈希码。哈希码被计算为底层方法的声明类名和方法名的哈希码的异或。 -
toString
返回描述此Method
的字符串。字符串的格式为方法访问修饰符(如果有)、方法返回类型、空格、声明方法的类、句点、方法名称、括号、逗号- 方法形式参数类型的分隔列表。如果该方法抛出已检查的异常,则参数列表后跟一个空格,然后是单词“throws
”,然后是抛出的异常类型的逗号分隔列表。例如:public boolean java.lang.Object.equals(java.lang.Object)
访问修饰符按照“Java 语言规范”指定的规范顺序放置。首先是
public
、protected
或private
,然后是其他修饰符,顺序如下:abstract
、default
、static
、final
、synchronized
、native
、strictfp
。- 重写:
toString
在类Object
中- 返回:
-
描述这个
Method
的字符串 - 看Java 语言规范:
-
8.4.3 方法修饰符
9.4 方法声明
9.6.1 注解元素
-
toGenericString
返回描述此Method
的字符串,包括类型参数。该字符串的格式为方法访问修饰符(如果有),后跟方法类型参数的尖括号逗号分隔列表(如果有),包括类型参数的信息范围(如果有),后跟方法的通用返回类型, 后跟一个空格,然后是声明该方法的类,再后跟一个句点,然后是方法名称,然后是用括号括起来的逗号分隔的方法通用形参类型列表。如果声明此方法采用可变数量的参数,而不是将最后一个参数表示为“Type[]
”,则将其表示为“Type...
”。空格用于将访问修饰符彼此分隔开,并与类型参数或返回类型分隔开。如果没有类型参数,则省略类型参数列表;如果存在类型参数列表,则用空格将列表与类名分隔开。如果该方法被声明为抛出异常,则参数列表后跟一个空格,然后是单词“throws
”,然后是通用抛出异常类型的逗号分隔列表。访问修饰符按照“Java 语言规范”指定的规范顺序放置。首先是
public
、protected
或private
,然后是其他修饰符,顺序如下:abstract
、default
、static
、final
、synchronized
、native
、strictfp
。- 指定者:
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
- 用于方法调用的参数- 返回:
-
使用参数
args
在obj
上调度此对象表示的方法的结果 - 抛出:
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 级覆盖。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
返回此Method
实例表示的注解成员的默认值。如果成员是原始类型,则返回相应包装器类型的实例。如果没有默认值与成员关联,或者如果方法实例不表示注释类型的已声明成员,则返回 null。- 返回:
-
此
Method
实例表示的注解成员的默认值。 - 抛出:
TypeNotPresentException
- 如果注解的类型为Class
并且找不到默认类值的定义。- 看Java 语言规范:
-
9.6.2 注释类型元素的默认值
- 自从:
- 1.5
-
getAnnotation
如果此类注解为 present ,则返回此元素针对指定类型的注解,否则为 null。请注意,此方法返回的任何注解都是声明注解。
- 指定者:
getAnnotation
在接口AnnotatedElement
中- 重写:
getAnnotation
在类Executable
中- 类型参数:
T
- 要查询并返回的注释类型(如果存在)- 参数:
annotationClass
——注解类型对应的Class对象- 返回:
- 如果此元素上存在此元素的指定注解类型的注解,则为 null
- 抛出:
NullPointerException
- 如果给定的注释类为 null- 自从:
- 1.5
-
getDeclaredAnnotations
返回此元素上的 directly present 注释。此方法忽略继承的注释。如果该元素上没有注解directly present,则返回值为长度为0的数组。该方法的调用者可以自由修改返回的数组;它不会影响返回给其他调用者的数组。请注意,此方法返回的任何注释都是声明注解。
- 指定者:
getDeclaredAnnotations
在接口AnnotatedElement
中- 重写:
getDeclaredAnnotations
在类AccessibleObject
中- 返回:
- 注释直接出现在这个元素上
- 自从:
- 1.5
-
getParameterAnnotations
返回Annotation
数组的数组,这些数组表示形式参数上的注释,按声明顺序,由该对象表示的Executable
。合成参数和强制参数(参见下面的解释),例如内部类构造函数的外部“this”参数将在返回的数组中表示。如果可执行文件没有参数(意味着没有正式的、没有综合的、没有强制的参数),将返回一个零长度数组。如果Executable
有一个或多个参数,则为每个没有注释的参数返回一个长度为零的嵌套数组。返回数组中包含的注释对象是可序列化的。该方法的调用者可以自由修改返回的数组;它不会影响返回给其他调用者的数组。编译器可能会在方法的参数列表中添加在源代码中隐式声明的额外参数(“强制”),以及在源代码中既没有隐式声明也没有显式声明的参数(“合成”)。有关详细信息,请参阅Parameter
。请注意,此方法返回的任何注释都是声明注解。
- 指定者:
getParameterAnnotations
在类Executable
中- 返回:
- 一个数组数组,表示此对象表示的可执行文件的形式参数和隐式参数的注释,按声明顺序排列
- 自从:
- 1.5
- 参见:
-
getAnnotatedReturnType
返回一个AnnotatedType
对象,该对象表示使用一种类型来指定此可执行文件表示的方法/构造函数的返回类型。如果这个Executable
对象表示构造函数,那么AnnotatedType
对象表示构造对象的类型。如果这个Executable
对象代表一个方法,那么AnnotatedType
对象代表使用一个类型来指定方法的返回类型。- 指定者:
getAnnotatedReturnType
在类Executable
中- 返回:
-
表示此
Executable
表示的方法或构造函数的返回类型的对象 - 自从:
- 1.8
-