方法参数反射

2024年8月29日 | 阅读 8 分钟

Java 提供了一个新特性,您可以在其中获取任何方法或构造函数的正式参数名称。java.lang.reflect 包包含所有必需的类,如 Method 和 Parameter,用于处理参数反射。

Method 类

它提供有关类或接口上单个方法的信息。反射方法可以是类方法或实例方法。

Method 类方法

方法描述
public boolean equals(Object obj)它将此 Method 与指定的对象进行比较。如果对象相同,则返回 true。如果两个 Method 由同一个类声明,并且具有相同的名称、正式参数类型和返回类型,则它们是相同的。
public AnnotatedType getAnnotatedReturnType()它返回一个 AnnotatedType 对象,该对象表示使用类型来指定方法/构造函数的返回类型。
public <T extends Annotation> T getAnnotation(Class<T> annotationClass)如果存在指定类型的注释,则返回此元素的注释,否则返回 null。NullPointerException - 如果给定的注释类为 null
public Annotation[] getDeclaredAnnotations()它返回直接存在于此元素上的注释。此方法忽略继承的注释。如果此元素上没有直接存在的注释,则返回值是一个长度为 0 的数组。此方法的调用者可以自由修改返回的数组。它不会对返回给其他调用者的数组产生任何影响。
public Class<?> getDeclaringClass()它返回表示声明此对象表示的可执行文件的类或接口的 Class 对象。
public Object getDefaultValue()它返回此 Method 实例表示的注释成员的默认值。
public Class<?>[] getExceptionTypes()它返回一个 Class 对象数组,表示由该对象表示的基础可执行文件声明要抛出的异常类型。
public Type[] getGenericExceptionTypes()它返回一个 Type 对象数组,表示此可执行对象声明要抛出的异常。如果基础可执行文件在其 throws 子句中未声明任何异常,则返回一个长度为 0 的数组。它抛出以下异常: GenericSignatureFormatError - 如果泛型方法签名不符合 Java 虚拟机规范中指定的格式。 TypeNotPresentException - 如果基础可执行文件的 throws 子句引用了不存在的类型声明。 MalformedParameterizedTypeException - 如果基础可执行文件的 throws 子句引用了由于任何原因无法实例化的参数化类型。
public Type[] getGenericParameterTypes()它返回一个 Type 对象数组,表示正式参数类型。它抛出以下异常: GenericSignatureFormatError - 如果泛型方法签名不符合 Java 虚拟机规范中指定的格式。 TypeNotPresentException - 如果基础可执行文件的任何参数类型引用了不存在的类型声明。 MalformedParameterizedTypeException - 如果基础可执行文件的任何参数类型引用了由于任何原因无法实例化的参数化类型。
public int getModifiers()它返回此对象表示的可执行文件的 Java 语言修饰符。
public String getName()它将此 Method 对象表示的方法的名称作为字符串返回。
public Annotation[][] getParameterAnnotations()它返回一个数组的数组,表示关于由该对象表示的可执行文件的正式和隐式参数(按声明顺序)的注释。
public int getParameterCount()它返回由该对象表示的可执行文件的正式参数的数量。
public Class<?>[] getParameterTypes()它返回一个 Class 对象数组,表示正式参数类型。按声明顺序,由该对象表示的可执行文件。如果基础可执行文件不带任何参数,则返回一个长度为 0 的数组。
public Class<?> getReturnType()它返回一个 Class 对象,该对象表示此 Method 对象表示的方法的正式返回类型。
public TypeVariable<Method>[] getTypeParameters()它返回一个 TypeVariable 对象数组,表示由该 GenericDeclaration 对象表示的泛型声明声明的类型变量,按声明顺序。如果此泛型声明的泛型签名不符合 Java 虚拟机规范中指定的格式,则抛出 GenericSignatureFormatError
public int hashCode()它为此 Method 返回一个哈希码。哈希码计算为基础方法的声明类名和方法的名称的异或。
public Object invoke(Object obj, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException它使用指定的参数在此 Method 对象表示的指定对象上调用基础方法。如果基础方法是静态的,则忽略指定的 obj 参数。它可以为 null。如果基础方法要求的正式参数的数量为 0,则提供的 args 数组的长度可以为 0 或 null。如果基础方法是实例方法,则使用 Java 语言规范中记录的动态方法查找来调用它。如果基础方法是静态的,则在尚未初始化的情况下初始化声明该方法的类。如果方法正常完成,则将其返回的值返回给 invoke 的调用者。
public boolean isBridge()如果此方法是桥接方法,则返回 true。否则返回 false。
public boolean isDefault()如果此方法是默认方法,则返回 true,否则返回 false。默认方法是一个公共的非抽象实例方法,也就是说,是在接口类型中声明的带有主体(非静态方法)的非静态方法。
public boolean isSynthetic()如果此可执行文件是合成结构,则返回 true;否则返回 false。
public boolean isVarArgs()如果声明此可执行文件接受可变数量的参数,则返回 true;否则返回 false。
public String toGenericString()它返回一个描述此 Method 的字符串,包括类型参数。
public String toString()它返回一个字符串。

Parameter 类

Parameter 类提供有关方法参数的信息,包括其名称和修饰符。它还提供了另一种获取参数属性的方法。

Parameter 方法

方法描述
public boolean equals(Object obj)它基于可执行文件和索引进行比较。
public AnnotatedType getAnnotatedType()它返回一个 AnnotatedType 对象,该对象表示使用类型来指定此 Parameter 表示的正式参数的类型。
public <T extends Annotation> T getAnnotation(Class<T> annotationClass)如果存在指定类型的注释,则返回此元素的注释,否则返回 null。如果给定的注释类为 null,则抛出 NullPointerException。
public Annotation[] getAnnotations()它返回存在于此元素上的注释。如果此元素上不存在任何注释,则返回值是一个长度为 0 的数组。
public <T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass)它返回与此元素关联的注释。如果此元素上没有关联的注释,则返回值是一个长度为 0 的数组。此方法与 AnnotatedElement.getAnnotation(Class) 之间的区别在于,此方法检测其参数是否为可重复注释类型 (JLS 9.6),如果是,则尝试通过“查看”容器注释来查找一个或多个该类型的注释。如果给定的注释类为 null,则抛出 NullPointerException。
public <T extends Annotation> T getDeclaredAnnotation(Class<T> annotationClass)如果存在直接存在指定类型的注释,则返回此元素的注释,否则返回 null。此方法忽略继承的注释。如果给定的注释类为 null,则抛出 NullPointerException。
public Annotation[] getDeclaredAnnotations()它返回直接存在于此元素上的注释。此方法忽略继承的注释。如果此元素上没有直接存在的注释,则返回值是一个长度为 0 的数组。
public <T extends Annotation> T[] getDeclaredAnnotationsByType(Class<T> annotationClass)如果存在直接或间接存在的指定类型的注释,则返回此元素的注释。此方法忽略继承的注释。如果此元素上没有直接或间接存在的指定注释,则返回值是一个长度为 0 的数组。此方法与 AnnotatedElement.getDeclaredAnnotation(Class) 之间的区别在于,此方法检测其参数是否为可重复注释类型 (JLS 9.6),如果是,则尝试通过“查看”容器注释(如果存在)来查找一个或多个该类型的注释。此方法的调用者可以自由修改返回的数组;它不会对返回给其他调用者的数组产生任何影响。如果给定的注释类为 null,则抛出 NullPointerException
public Executable getDeclaringExecutable()它返回声明此参数的 Executable。
public int getModifiers()它返回由该 Parameter 对象表示的参数的修饰符标志。
public String getName()它返回参数的名称。如果存在参数的名称,则此方法返回类文件提供的名称。否则,此方法合成一个名为 argN 的名称,其中 N 是声明该参数的方法的描述符中参数的索引。
public Type getParameterizedType()它返回一个 Type 对象,该对象标识此 Parameter 对象表示的参数的参数化类型。
public Class<?> getType()它返回一个 Class 对象,该对象标识此 Parameter 对象表示的参数的声明类型。
public int hashCode()mul int arg0 int arg1 add int arg0 int arg1它返回基于可执行文件的哈希码和索引的哈希码。
public boolean isImplicit()如果此参数在源代码中隐式声明,则返回 true。否则,返回 false。
public boolean isNamePresent()如果该参数根据类文件具有名称,则返回 true,否则返回 false。
public boolean isSynthetic()如果此参数既未在源代码中隐式声明,也未显式声明,则返回 true。否则返回 false。
public boolean isVarArgs()如果此参数表示可变参数列表,则返回 true;否则返回 false。
public String toString()它返回一个字符串,描述此参数。格式是参数的修饰符(如果有),按照 Java? 语言规范推荐的规范顺序排列。

Java 方法参数反射示例

文件: Calculate.java

注意 - 在编译和执行以下代码之前,请先使用以下命令编译 Calculate 类

以上命令中的 -parameter 标志用于将参数存储在 Calculate 类文件中。 默认情况下,.class 文件不存储参数,并返回 argsN 作为参数名称,其中 N 是方法中参数的数量。

文件: ParameterReflection.java

输出

mul int a int b
add int a int b

如果您未使用 -parameters 标志编译 Calculate.java 文件,则上述代码将产生以下输出。

输出

mul int arg0 int arg1
add int arg0 int arg1