Java 8方法参数映射

本文概述

  • 参数类别
  • Java方法参数反射示例
【Java 8方法参数映射】Java提供了一项新功能, 你可以在其中获取任何方法或构造函数的形式参数的名称。 java.lang.reflect包包含所有必需的类, 例如Method和Parameter, 可用于参数反射。
方法类别
它提供有关类或接口上的单个方法的信息。反映的方法可以是类方法或实例方法。
方法类方法
方法 描述
public boolean equals(Object obj) 它将此Method与指定对象进行比较。如果对象相同, 则返回true。如果两个方法是由相同的类声明的, 并且具有相同的名称, 形式参数类型和返回类型, 则它们是相同的。
public AnnotatedType getAnnotatedReturnType() 它返回一个AnnotatedType对象, 该对象表示使用类型指定方法/构造函数的返回类型。
公共< T扩展注释> T getAnnotation(Class < T> 注记类) 如果存在这样的注释, 它将为指定的类型返回该元素的注释, 否则返回null。 NullPointerException-如果给定的注释类为null
public Annotation[] getDeclaredAnnotations() 它返回直接存在于此元素上的注释。此方法将忽略继承的注释。如果此元素上没有直接存在的注释, 则返回值为长度为0的数组。此方法的调用者可以自由修改返回的数组。它对返回给其他调用方的数组没有影响。
公共类< ?> getDeclaringClass() 它返回表示类或接口的Class对象, 该类或接口声明此对象表示的可执行文件。
public Object getDefaultValue() 它返回此Method实例表示的注释成员的默认值。
公共类< ?> [] 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() 它以String形式返回此Method对象表示的方法的名称。
public Annotation[][] getParameterAnnotations() 它返回一个数组数组, 这些数组按声明顺序表示此对象表示的可执行文件的形式参数和隐式参数上的注释。
public int getParameterCount() 它返回此对象表示的可执行文件的形式参数数量。
公共类< ?> [] getParameterTypes() 它返回代表形式参数类型的Class对象数组。按照此对象表示的可执行文件的声明顺序。如果基础可执行文件不接受任何参数, 它将返回长度为0的数组。
公共类< ?> getReturnType() 它返回一个Class对象, 该对象表示此Method对象表示的方法的形式返回类型。
公共TypeVariable < Method> [] getTypeParameters() 它以声明顺序返回TypeVariable对象数组, 这些对象代表此GenericDeclaration对象表示的泛型声明所声明的类型变量。如果此通用声明的通用签名不符合Java虚拟机规范中指定的格式, 则会引发GenericSignatureFormatError。
public int hashCode() 它为此方法返回一个哈希码。哈希码被计算为基础方法的声明类名和方法名的哈希码的异或。
公共对象invoke(Object obj, Object … args)抛出IllegalAccessException, IllegalArgumentException, InvocationTargetException 它在具有指定参数的指定对象上调用此Method对象表示的基础方法。如果基础方法是静态的, 则忽略指定的obj参数。它可以为空。如果基础方法所需的形式参数数量为0, 则提供的args数组的长度可以为0或为null。如果基础方法是实例方法, 则使用《 Java语言规范》中所述的动态方法查找来调用它。如果基础方法是静态的, 则声明该方法的类(如果尚未初始化)将被初始化。如果该方法正常完成, 则它将返回的值返回给invoke的调用者。
public boolean isBridge() 如果此方法是桥接方法, 则返回true。否则返回false。
public boolean isDefault() 如果此方法是默认方法, 则返回true, 否则返回false。默认方法是公共的非抽象实例方法, 即在接口类型中声明的带有主体的非静态方法。
public boolean isSynthetic() 如果此可执行文件是合成构造, 则返回true;否则, 返回true。否则返回false。
public boolean isVarArgs() 如果声明该可执行文件采用可变数量的参数, 则返回true;否则, 返回true。否则返回false。
public String toGenericString() 它返回描述此Method的字符串, 包括类型参数。
public String toString() 它返回一个字符串。
参数类别参数类提供有关方法参数的信息, 包括其名称和修饰符。它还提供了获取参数属性的替代方法。
参数方法
方法 描述
public boolean equals(Object obj) 它根据可执行文件和索引进行比较。
public AnnotatedType getAnnotatedType() 它返回一个AnnotatedType对象, 该对象表示使用一种类型来指定此Parameter表示的形式参数的类型。
公共< T扩展注释> T getAnnotation(Class < T> 注记类) 如果存在这样的注释, 它将为指定的类型返回该元素的注释, 否则为null。如果给定的注释类为null, 则抛出NullPointerException。
public Annotation[] getAnnotations() 它返回此元素上存在的注释。如果此元素上没有注释, 则返回值为长度为0的数组。
公共< T扩展注释> T [] getAnnotationsByType(Class < T> 注记类) 它返回与此元素关联的注释。如果没有与此元素相关联的注释, 则返回值为长度为0的数组。此方法与AnnotatedElement.getAnnotation(Class)之间的区别在于, 此方法检测其参数是否为可重复的注释类型(JLS 9.6), 如果是这样, 则尝试通过“浏览”容器注释来查找该类型的一个或多个注释。如果给定的注释类为null, 则抛出NullPointerException。
公共< T扩展注释> T getDeclaredAnnotation(Class < T> 注解类) 如果直接存在该元素的注释, 则它将返回指定类型的注释, 否则返回null。此方法将忽略继承的注释。如果给定的注释类为null, 则抛出NullPointerException。
public Annotation[] getDeclaredAnnotations() 它返回直接存在于此元素上的注释。此方法将忽略继承的注释。如果此元素上没有直接存在的注释, 则返回值为长度为0的数组。
公共< T扩展注释> T [] getDeclaredAnnotationsByType(Class < T> 注解类) 如果此类注释直接存在或间接存在, 则它将为指定的类型返回此元素的注释。此方法将忽略继承的注释。如果此元素上没有直接或间接存在的指定注释, 则返回值为长度为0的数组。此方法与AnnotatedElement.getDeclaredAnnotation(Class)之间的区别在于, 此方法检测其参数是否为可重复的注释类型( JLS 9.6), 如果是这样, 则尝试通过“浏览”容器注释(如果存在)来查找该类型的一个或多个注释。该方法的调用者可以随意修改返回的数组;它对返回给其他调用方的数组没有影响。如果给定的注释类为null, 则抛出NullPointerException
public Executable getDeclaringExecutable() 它返回声明此参数的可执行文件。
public int getModifiers() 它返回此Parameter对象表示的参数的修饰符标志。
public String getName() 它返回参数的名称。如果存在参数的名称, 则此方法返回由类文件提供的名称。否则, 此方法将合成形式为argN的名称, 其中N是声明该参数的方法的描述符中参数的索引。
public Type getParameterizedType() 它返回一个Type对象, 该对象标识此Parameter对象表示的参数的参数化类型。
公共类< ?> 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;否则, 返回true。否则返回false。
public String toString() 它返回描述此参数的字符串。格式是参数的修饰符(如果有的话), 按照Java?语言规范。
Java方法参数反射示例文件:Calculate.java
public class Calculate { int add(int a, int b){ return (a+b); } int mul(int a, int b){ return (b*a); } }

注意-在编译和执行以下代码之前, 请先通过以下命令编译Calculate类:
javac -parameters Calculate.java

上面命令中的-parameter标志用于将参数存储在Calculate类文件中。默认情况下, .class不存储参数, 并返回argsN作为参数名称, 其中N是方法中的许多参数。
文件:ParameterReflection.java
import java.lang.reflect.Method; import java.lang.reflect.Parameter; public class ParameterReflection { public static void main(String[] args) { // Creating object of a class Calculate calculate = new Calculate(); // instantiating Class class Classcls = calculate.getClass(); // Getting declared methods inside the Calculate class Method[] method = cls.getDeclaredMethods(); // It returns array of methods // Iterating method array for (Method method2 : method) { System.out.print(method2.getName()); // getting name of method // Getting parameters of each method Parameter parameter[] = method2.getParameters(); // It returns array of parameters // Iterating parameter array for (Parameter parameter2 : parameter) { System.out.print(""+parameter2.getParameterizedType()); // returns type of parameter System.out.print(""+parameter2.getName()); // returns parameter name } System.out.println(); } } }

输出:
mul int a int b add int a int b

如果你不使用-parameters标志来编译Calculate.java文件, 则上面的代码将产生以下输出。
输出:
mul int arg0 int arg1 add int arg0 int arg1

    推荐阅读