知识点:
1、Java反射中方法的属性类Method的方法解释;
说到Java的反射,听起来是挺让人头疼的,而且在大多数的程序中,我们都用不到反射这个技术;但是我们还是要有一些准备才行,比如在获取到一个类的时候,我们可以获取到一个类的所有方法的属性,这个属性就是由Method所代表的,这个method类里头,我们可以获取到所有关于这个类里头方法的所有信息,包括方法名,方法的修饰符和方法的入参和返回参数等等的详细信息,然后我们就可以根据这些信息来判断,应该要调用哪一个方法,才满足我们的业务需求。下面是这个Method类的重要的方法属性讲解。
java之Method类属性
getTypeParameters
public TypeVariable<Method>[]getTypeParameters()
返回 TypeVariable 对象的数组,这些对象描述了由 GenericDeclaration 对象表示的一般声明按声明顺序来声明的类型变量。如果底层一般声明没有声明类型变量,则返回长度为 0 的数组。
指定者:
接口 GenericDeclaration 中的 getTypeParameters
返回:
TypeVariable 对象的数组,这些对象描述了通过一般声明来声明的类型变量
抛出:
GenericSignatureFormatError - 如果此一般声明的一般签名不符合 Java Virtual Machine Specification, 3rd edition 中指定的格式
getReturnType
public Class<?> getReturnType()
返回一个 Class 对象,该对象描述了此 Method 对象所表示的方法的正式返回类型。
返回:
此对象所表示的方法的返回类型
getGenericReturnType
public Type getGenericReturnType()
返回表示由此 Method 对象所表示方法的正式返回类型的 Type 对象。
如果返回类型是参数化类型,则返回的 Type 对象必须实际反映源代码中所用参数的实际类型。
如果返回类型是类型变量或参数化类型,则创建它。否则将解析它。
返回:
表示底层方法的正式返回类型的 Type 对象
抛出:
GenericSignatureFormatError - 如果一般方法签名不符合 Java Virtual Machine Specification, 3rd edition 中指定的格式
TypeNotPresentException - 如果底层方法的返回类型引用不存在的类型声明
MalformedParameterizedTypeException - 如果底层方法的返回类型引用无论如何都无法实例化的参数化类型
getParameterTypes
public Class<?>[] getParameterTypes()
按照声明顺序返回 Class 对象的数组,这些对象描述了此 Method 对象所表示的方法的形参类型。如果底层方法不带参数,则返回长度为 0 的数组。
返回:
此对象所表示的方法的参数类型
getGenericParameterTypes
public Type[] getGenericParameterTypes()
按照声明顺序返回 Type 对象的数组,这些对象描述了此 Method 对象所表示的方法的形参类型的。如果底层方法不带参数,则返回长度为 0 的数组。
如果形参类型是参数化类型,则为其返回的 Type 对象必须实际反映源代码中使用的实际类型参数。
如果形参类型是类型变量或参数化类型,则创建它。否则将解析它。
返回:
按照声明顺序返回表示底层方法的形参类型的 Type 对象数组
抛出:
GenericSignatureFormatError - 如果一般方法签名不符合 Java Virtual Machine Specification, 3rd edition 中指定的格式
TypeNotPresentException - 如果底层方法的所有参数类型都引用不存在的类型声明
MalformedParameterizedTypeException - 如果所有底层方法的参数类型引用无论如何都无法实例化的参数化类型
getExceptionTypes
public Class<?>[] getExceptionTypes()
返回 Class 对象的数组,这些对象描述了声明将此 Method 对象表示的底层方法抛出的异常类型。如果此方法没有在其 throws 子句中声明异常,则返回长度为 0 的数组。
返回:
声明由此对象表示的方法抛出的异常类型
getGenericExceptionTypes
public Type[] getGenericExceptionTypes()
返回 Type 对象数组,这些对象描述了声明由此 Method 对象抛出的异常。如果底层方法没有在其 throws 子句中声明异常,则返回长度为 0 的数组。
如果异常类型是参数化的类型,那么为它返回的 Type 对象必须实际反映源代码中所用参数的实际类型。
如果异常类型是类型变量或参数化类型,则创建它。否则将解析它。
返回:
表示由底层方法抛出的异常类型的 Type 数组
抛出:
GenericSignatureFormatError - 如果一般方法签名不符合 Java Virtual Machine Specification, 3rd edition 中指定的格式
TypeNotPresentException - 如果底层方法的 throws 子句引用不存在的类型声明
MalformedParameterizedTypeException - 如果底层方法的 throws 子句引用无论如何都无法实例化的参数化类型
toGenericString
public String toGenericString() 返回方法的除了实现的之外的所有信息
返回描述此 Method 的字符串,包括类型参数。该字符串被格式化为方法访问修饰符(如果有),依次后跟用尖括号括起来的由逗号分隔的方法类型参数列表(如果有)、方法的一般返回类型、空格、声明方法的类、句点、方法名、括号以及由逗号分隔的方法的一般形参类型列表。空格用于将访问修饰符和类型参数或返回类型互相分隔开。如果不存在类型参数,则类型参数列表会被省略;如果类型参数列表存在,则用空格将列表与类名分隔开。如果声明方法以抛出异常,则参数列表后跟空格、单词 throws 以及由逗号分隔开的抛出一般异常类型的列表。如果不存在类型参数,则类型参数列表会被省略。
访问修饰符按照 "The Java Language Specification" 指定的规范化顺序放置。首先是 public,protected 或 private,接着是按以下顺序的其他修饰符:abstract、static、final、synchronized native。
返回:
描述此 Method 方法的字符串,包括类型参数
invoke
public Object invoke(Object obj,
Object... args)
throws IllegalAccessException,
IllegalArgumentException,
InvocationTargetException
对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换。
如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。
如果底层方法所需的形参数为 0,则所提供的 args 数组长度可以为 0 或 null。
如果底层方法是实例方法,则使用动态方法查找来调用它,这一点记录在 Java Language Specification, Second Edition 的第 15.12.4.4 节中;在发生基于目标对象的运行时类型的重写时更应该这样做。
如果底层方法是静态的,并且尚未初始化声明此方法的类,则会将其初始化。
如果方法正常完成,则将该方法返回的值返回给调用者;如果该值为基本类型,则首先适当地将其包装在对象中。但是,如果该值的类型为一组基本类型,则数组元素不 被包装在对象中;换句话说,将返回基本类型的数组。如果底层方法返回类型为 void,则该调用返回 null。
参数:
obj - 从中调用底层方法的对象
args - 用于方法调用的参数
返回:
使用参数 args 在 obj 上指派该对象所表示方法的结果
抛出:
IllegalAccessException - 如果此 Method 对象强制执行 Java 语言访问控制,并且底层方法是不可访问的。
IllegalArgumentException - 如果该方法是实例方法,且指定对象参数不是声明底层方法的类或接口(或其中的子类或实现程序)的实例;如果实参和形参的数量不相同;如果基本参数的解包转换失败;如果在解包后,无法通过方法调用转换将参数值转换为相应的形参类型。
InvocationTargetException - 如果底层方法抛出异常。
NullPointerException - 如果指定对象为 null,且该方法是一个实例方法。
ExceptionInInitializerError - 如果由此方法引起的初始化失败
isBridge
public boolean isBridge()
如果此方法是 bridge 方法,则返回 true;否则,返回 false。
返回:
当且仅当此方法是由 Java Language Specification 定义的 bridge 方法时,才返回 true。
isVarArgs
public boolean isVarArgs()
如果将此方法声明为带有可变数量的参数,则返回 true;否则,返回 false。
返回:
当且仅当将此方法声明为带有可变数量的参数时,才返回 true
isSynthetic
public boolean isSynthetic()
如果此方法为复合方法,则返回 true;否则,返回 false。
指定者:
接口 Member 中的 isSynthetic
返回:
当且仅当此方法是由 Java Language Specification 定义的复合方法时,才返回 true
getAnnotation
public <T extends Annotation> TgetAnnotation(Class<T> annotationClass)
从接口 AnnotatedElement 复制的描述
如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。
指定者:
接口 AnnotatedElement 中的 getAnnotation
覆盖:
类 AccessibleObject 中的 getAnnotation
参数:
annotationClass - 对应于注释类型的 Class 对象
返回:
如果该元素的指定注释类型的注释存在于此对象上,则返回这些注释,否则返回 null
抛出:
NullPointerException - 如果给定的注释类为 null
getDeclaredAnnotations
public Annotation[] getDeclaredAnnotations() Annotations是注释类
从接口 AnnotatedElement 复制的描述
返回直接存在于此元素上的所有注释。与此接口中的其他方法不同,该方法将忽略继承的注释。(如果没有注释直接存在于此元素上,则返回长度为零的一个数组。)该方法的调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响。
指定者:
接口 AnnotatedElement 中的 getDeclaredAnnotations
覆盖:
类 AccessibleObject 中的 getDeclaredAnnotations
返回:
直接存在于此元素上的所有注释
getParameterAnnotations
public Annotation[][]getParameterAnnotations() http://www.cnblogs.com/maxblog/archive/2010/09/01/1814821.html有较详细的解释,用法
返回表示按照声明顺序对此 Method 对象所表示方法的形参进行注释的那个数组的数组。(如果底层方法没有参数,则返回长度为零的数组。如果该方法有一个或多个参数,则为每个不带注释的参数返回长度为零的嵌套数组。)返回数组中包含的注释对象是可序列化的。此方法的调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响。
返回:
表示按声明顺序对此 Method 对象所表示方法的形参进行注释的那个数组的数组
getDeclaringClass
public Class<?> getDeclaringClass()
返回表示声明由此 Method 对象表示的方法的类或接口的 Class 对象。
指定者:
接口 Member 中的 getDeclaringClass
返回:
表示声明底层成员的类的对象
getName
public String getName()
以 String 形式返回此 Method 对象表示的方法名称。
指定者:
接口 Member 中的 getName
返回:
底层成员的简单名称
getModifiers
public int getModifiers()返回方法的修饰符,例如public=1/ private(2)/FINAL(16=0x00000010)
以整数形式返回此 Method 对象所表示方法的 Java 语言修饰符。应该使用 Modifier 类对修饰符进行解码。
指定者:
接口 Member 中的 getModifiers
返回:
底层成员的 Java 语言修饰符
另请参见:
Modifier
在Modifier类里面,同理有
类修饰符
private static final int CLASS_MODIFIERS =
Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE |
Modifier.ABSTRACT | Modifier.STATIC | Modifier.FINAL |
Modifier.STRICT;
接口修饰符 INTERFACE_MODIFIERS
private static final int INTERFACE_MODIFIERS =
Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE |
Modifier.ABSTRACT | Modifier.STATIC | Modifier.STRICT;
构造函数修饰符
private static final int CONSTRUCTOR_MODIFIERS =
Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE;
方法修饰符
private static final int METHOD_MODIFIERS =
Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE |
Modifier.ABSTRACT | Modifier.STATIC | Modifier.FINAL |
Modifier.SYNCHRONIZED | Modifier.NATIVE | Modifier.STRICT;
字段修饰符
private static final int FIELD_MODIFIERS =
Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE |
Modifier.STATIC | Modifier.FINAL | Modifier.TRANSIENT |
Modifier.VOLATILE;