第一章 java 基础 - 05反射(序)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_39923324/article/details/82222993

无意间都到一篇《走心的安卓工程师跳槽经验分享》,发现自己工作几年了,技术方面虽然有了飞跃的进步,可是不知道自己的技术到了什么地步,每个方面我都涉及到了,但都不深,这大概是初级工程师的诟病吧!

即使知道也不知道从何下手,非常感谢《走心的安卓工程师跳槽经验分享》的作者!

感兴趣的朋友和我一起走下去吧!

05反射

深入理解 Java 反射:Class (反射的入口)上

深入理解 Java 反射:Field (成员变量)中

深入理解 Java 反射:Method (成员方法)下

JAVA反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

说到反射就不得不提Java中Class,CLass代表的意思就是类,如果连Class都没有见过,那么永远就是一个小学生。

Class<T>

package:java.lang

java.lang.Object继承

类型参数:
T - 由此Class对象建模的类的类型。
例如,String.class的类型是Class 。 如果正在建模的类未知,请使用Class <?>。
所有已实现的接口:
Serializable,AnnotatedElement,GenericDeclaration,Type

 public final class Class<T>
            extends Object
            implements Serializable, GenericDeclaration, Type, AnnotatedElement{

    }

类Class的实例表示正在运行的Java应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组也属于一个类,它反映为一个Class对象,由具有相同元素类型和维数的所有数组共享。原始Java类型(boolean,byte,char,short,int,long,float和double)以及关键字void也表示为Class对象。
类没有公共构造函数。相反,类对象由Java虚拟机在加载类时自动构造,并通过调用类加载器中的defineClass方法。

以下示例使用Class对象来打印对象的类名:

 void printClassName(Object obj) {
         System.out.println("The class of " + obj +
                            " is " + obj.getClass().getName());
     }

也可以使用类文字获取命名类型(或void)的Class对象。

System.out.println("The name of class Foo is: "+Foo.class.getName());

方法:

public String toString()
将对象转换为字符串。 字符串表示形式是字符串“class”或“interface”,后跟空格,然后是getName返回的格式的类的完全限定名称。 如果此Class对象表示基本类型,则此方法返回基本类型的名称。 如果此Class对象表示void,则此方法返回“void”。
覆盖:
类Object中的toString
返回:
此类对象的字符串表示形式。
public static Class <?> forName(String className) throws ClassNotFoundException
返回与具有给定字符串名称的类或接口关联的Class对象。
调用此方法相当于:
Class.forName(className,true,currentLoader)
其中currentLoader表示当前类的定义类加载器。
例如,以下代码片段返回名为java.lang.Thread的类的运行时类描述符:

Class t = Class.forName(“java.lang.Thread”)
对forName(“X”)的调用会导致名为X的类被初始化。
参数:
className - 所需类的完全限定名称。
返回:
具有指定名称的类的Class对象。
抛出:
LinkageError - 如果链接失败
ExceptionInInitializerError - 如果此方法引发的初始化失败
ClassNotFoundException - 如果找不到类
public static Class<?> forName(String name,
               boolean initialize,
               ClassLoader loader)
                        throws ClassNotFoundException
使用给定的类加载器返回与具有给定字符串名称的类或接口关联的Class对象。给定类或接口的完全限定名称(以getName返回的相同格式),此方法尝试查找,加载和链接类或接口。指定的类加载器用于加载类或接口。如果参数加载器为null,则通过引导类加载器加载该类。仅当initialize参数为true且之前尚未初始化时,才会初始化该类。
如果name表示基本类型或void,则将尝试在名称为name的未命名包中查找用户定义的类。因此,此方法不能用于获取表示基本类型或void的任何Class对象。
如果name表示数组类,则加载数组类的组件类型但不初始化。
例如,在实例方法中,表达式为:
Class.forName("Foo")
相当于:
Class.forName("Foo", true, this.getClass().getClassLoader())
请注意,此方法会抛出与Java语言规范的第12.2节,第12.3节和第12.4节中指定的加载,链接或初始化相关的错误。请注意,此方法不会检查其调用者是否可以访问所请求的类。
如果加载器为null,并且存在安全管理器,并且调用者的类加载器不为null,则此方法使用RuntimePermission(“getClassLoader”)权限调用安全管理器的checkPermission方法,以确保可以访问引导类加载器。
参数:
name - 所需类的完全限定名称
initialize - 是否必须初始化类
loader - 必须加载类的类加载器
返回:
表示所需类的类对象
抛出:
LinkageError - 如果链接失败
ExceptionInInitializerError - 如果此方法引发的初始化失败
ClassNotFoundException - 如果指定的类加载器无法找到该类
public T newInstance()
              throws InstantiationException,
                     IllegalAccessException
创建此Class对象表示的类的新实例。该类实例化为具有空参数列表的新表达式。如果尚未初始化,则初始化该类。
请注意,此方法传播由Nullary构造函数抛出的任何异常,包括已检查的异常。使用此方法可以有效地绕过编译时异常检查,否则将由编译器执行。 Constructor.newInstance方法通过在(已检查的)InvocationTargetException中包装构造函数抛出的任何异常来避免此问题。
返回:
由此对象表示的类的新分配实例。
抛出:
IllegalAccessException - 如果类或其无效构造函数不可访问。
InstantiationException - 如果此Class表示抽象类,接口,数组类,基元类型或void;或者如果该类没有无效的构造函数;或者如果实例化由于其他原因而失败。
ExceptionInInitializerError - 如果此方法引发的初始化失败。
SecurityException - 如果存在安全管理器s且满足以下任何条件:
调用s.checkMemberAccess(this,Member.PUBLIC)拒绝创建此类的新实例
调用者的类加载器与当前类的类加载器的祖先或祖先不同,并且s.checkPackageAccess()的调用拒绝访问此类的包


public boolean isInstance(Object obj)
确定指定的Object是否与此Class表示的对象分配兼容。此方法是Java语言instanceof运算符的动态等效项。如果指定的Object参数为非null,则该方法返回true,并且可以强制转换为此Class对象表示的引用类型,而不会引发ClassCastException。否则返回false。
具体来说,如果此Class对象表示声明的类,则如果指定的Object参数是所表示的类(或其任何子类)的实例,则此方法返回true;否则返回false。如果此Class对象表示数组类,则如果可以通过标识转换或扩展引用转换将指定的Object参数转换为数组类的对象,则此方法返回true;否则返回false。如果此Class对象表示接口,则如果指定Object参数的类或任何超类实现此接口,则此方法返回true;否则返回true。否则返回false。如果此Class对象表示基本类型,则此方法返回false。
参数:
obj - 要检查的对象
返回:
如果obj是此类的实例,则为true
public boolean isAssignableFrom(Class <?> cls)
确定此Class对象表示的类或接口是否与指定的Class参数表示的类或接口相同,或者是它们的超类或超接口。如果是这样,它返回true;否则返回false。如果此Class对象表示基本类型,则如果指定的Class参数恰好是此Class对象,则此方法返回true;否则返回true。否则返回false。
具体来说,此方法测试是否可以通过标识转换或扩展引用转换将指定的Class参数表示的类型转换为此Class对象表示的类型。
参数:
cls - 要检查的Class对象
返回:
boolean值,指示是否可以将类型为cls的对象分配给此类的对象
抛出:
NullPointerException - 如果指定的Class参数为null。
public boolean isInterface()
确定指定的Class对象是否表示接口类型。
返回:
如果此对象表示接口,则为true;否则是假的。
public boolean isArray()
确定此Class对象是否表示数组类。
返回:
如果此对象表示数组类,则返回true;否则是假的。
public boolean isPrimitive()
确定指定的Class对象是否表示基本类型。
有九个预定义的Class对象来表示八种基本类型和void。它们由Java虚拟机创建,并且与它们表示的基本类型具有相同的名称,即booleanbytecharshortintlongfloatdouble。
这些对象只能通过以下public static final变量访问,并且是此方法返回true的唯一Class对象。
返回:
当且仅当此类表示基本类型时才返回true
public boolean isAnnotation()
如果此Class对象表示注释类型,则返回true。请注意,如果此方法返回true,则isInterface()也将返回true,因为所有注释类型也是接口。
返回:
如果此类对象表示注释类型,则为true;否则为false。否则是假的
public boolean isSynthetic()
如果此类是合成类,则返回true;否则返回false。
返回:
当且仅当此类是Java语言规范定义的合成类时才返回true
public String getName()
以String形式返回此Class对象表示的实体名称(类,接口,数组类,基本类型或void)。
如果此类对象表示不是数组类型的引用类型,则返回类的二进制名称,如Java™语言规范所指定。
如果此类对象表示基本类型或void,则返回的名称是一个String,它等于与基本类型或void相对应的Java语言关键字。
如果此类对象表示一个数组类,则名称的内部形式由元素类型的名称组成,前面有一个或多个'['字符,表示数组嵌套的深度。元素类型名称的编码如下:
元素类型编码
Element Type                        Encoding
boolean                             Z
byte                                B
char                                C
class or interface                  Lclassname;
double                              D
float                               F
int                                 I
long                                J
short                               S
类或接口名称classname是上面指定的类的二进制名称。
例子:
 String.class.getName()
     returns "java.lang.String"
 byte.class.getName()
     returns "byte"
 (new Object[3]).getClass().getName()
     returns "[Ljava.lang.Object;"
 (new int[3][4][5][6][7][8][9]).getClass().getName()
     returns "[[[[[[[I"

返回:
此对象表示的类或接口的名称。
public ClassLoader getClassLoader()
返回类的类加载器。某些实现可能使用null来表示引导类加载器。如果此类由引导类加载器加载,则此方法将在此类实现中返回null。
如果存在安全管理器,并且调用者的类加载器不为null且调用者的类加载器与请求类加载器的类的类加载器的祖先不同,则此方法调用安全管理器的checkPermission方法具有RuntimePermission(“getClassLoader”)权限,以确保可以访问类的类加载器。
如果此对象表示基本类型或void,则返回null。
返回:
加载此对象表示的类或接口的类加载器。
抛出:
SecurityException - 如果存在安全管理器且其checkPermission方法拒绝访问该类的类加载器。
public TypeVariable <Class <T >> [] getTypeParameters()
返回TypeVariable对象的数组,这些对象表示由此GenericDeclaration对象以声明顺序表示的泛型声明声明的类型变量。如果基础泛型声明未声明类型变量,则返回长度为0的数组。
具体说明:
接口GenericDeclaration中的getTypeParameters
返回:
一个TypeVariable对象数组,表示此泛型声明声明的类型变量
抛出:
GenericSignatureFormatError - 如果此通用声明的通用签名不符合Java™虚拟机规范中指定的格式
public Class<? super T> getSuperclass()
返回表示此Class表示的实体(类,接口,基本类型或void)的超类的Class。如果此Class表示Object类,接口,基本类型或void,则返回null。如果此对象表示数组类,则返回表示Object类的Class对象。
返回:
此对象表示的类的超类。
public类型getGenericSuperclass()
返回表示此Class表示的实体(类,接口,基本类型或void)的直接超类的Type。
如果超类是参数化类型,则返回的Type对象必须准确反映源代码中使用的实际类型参数。如果之前尚未创建超类,则创建表示超类的参数化类型。有关参数化类型的创建过程的语义,请参阅ParameterizedType的声明。如果此Class表示Object类,接口,基本类型或void,则返回null。如果此对象表示数组类,则返回表示Object类的Class对象。
返回:
此对象表示的类的超类
抛出:
GenericSignatureFormatError - 如果泛型类签名不符合Java™虚拟机规范中指定的格式
TypeNotPresentException - 如果泛型超类引用不存在的类型声明
MalformedParameterizedTypeException - 如果泛型超类引用无法以任何原因实例化的参数化类型


public Package getPackage()
获取此类的包。此类的类加载器用于查找包。如果类由引导类加载器加载,则搜索从CLASSPATH加载的包集以查找该类的包。如果此类的类加载器未创建包对象,则返回Null。
只有在类附带的清单中定义了信息,并且类加载器使用清单中的属性创建了包实例时,包才具有版本和规范的属性。
返回:
类的包,如果归档或代码库中没有可用的包信息,则返回null
public Class <?> [] getInterfaces()
确定由此对象表示的类或接口实现的接口。
如果此对象表示类,则返回值是一个数组,其中包含表示该类实现的所有接口的对象。数组中接口对象的顺序对应于此对象所表示的类的声明的implements子句中的接口名称的顺序。例如,鉴于声明:

class Shimmer implements FloorWax, DessertTopping { ... }
假设s的值是Shimmer的一个实例;表达式的值:
s.getClass().getInterfaces()[0]
是表示接口FloorWax的Class对象;和价值:
s.getClass().getInterfaces()[1]
是表示接口DessertToppingClass对象。
如果此对象表示接口,则该数组包含表示接口扩展的所有接口的对象。数组中接口对象的顺序对应于此对象表示的接口声明的extends子句中接口名称的顺序。
如果此对象表示不实现接口的类或接口,则该方法返回长度为0的数组。
如果此对象表示基本类型或void,则该方法返回长度为0的数组。
返回:
此类实现的接口数组。
public Type [] getGenericInterfaces()
返回表示由此对象表示的类或接口直接实现的接口的Types。
如果超接口是参数化类型,则为其返回的Type对象必须准确反映源代码中使用的实际类型参数。如果之前尚未创建,则创建表示每个超级接口的参数化类型。有关参数化类型的创建过程的语义,请参阅ParameterizedType的声明。
如果此对象表示类,则返回值是一个数组,其中包含表示该类实现的所有接口的对象。数组中接口对象的顺序对应于此对象所表示的类的声明的implements子句中的接口名称的顺序。对于数组类,接口CloneableSerializable按此顺序返回。
如果此对象表示接口,则该数组包含表示由接口直接扩展的所有接口的对象。数组中接口对象的顺序对应于此对象表示的接口声明的extends子句中接口名称的顺序。
如果此对象表示不实现接口的类或接口,则该方法返回长度为0的数组。
如果此对象表示基本类型或void,则该方法返回长度为0的数组。
返回:
此类实现的接口数组
抛出:
GenericSignatureFormatError - 如果泛型类签名不符合Java™虚拟机规范中指定的格式
TypeNotPresentException - 如果任何通用超接口引用了不存在的类型声明
MalformedParameterizedTypeException - 如果任何通用超接口引用无法以任何原因实例化的参数化类型
public Class <?> getComponentType()
返回表示数组的组件类型的Class。如果此类不表示数组类,则此方法返回null。
返回:
如果此类是数组,则表示此类的组件类型的Class
public int getModifiers()
返回此类或接口的Java语言修饰符,以整数编码。修饰符由Java虚拟机的公共,受保护,私有,最终,静态,抽象和接口的常量组成;它们应该使用类Modifier的方法进行解码。
如果底层类是数组类,则其publicprivateprotected修饰符与其组件类型相同。如果此Class表示基本类型或void,则其public修饰符始终为true,其protectedprivate修饰符始终为false。如果此对象表示数组类,基本类型或void,则其最终修饰符始终为true,其接口修饰符始终为false。其他修饰符的值不是由本规范确定的。
返回:
int表示此类的修饰符
public Object [] getSigners()
获取此类的签名者。
返回:
此类的签名者,如果没有签名者则为null。特别是,如果此对象表示基本类型或void,则此方法返回null
public Method getEnclosingMethod()
如果此Class对象表示方法中的本地或匿名类,则返回表示基础类的直接封闭方法的Method对象。否则返回null。特别是,如果基础类是由类型声明,实例初始化程序或静态初始化程序直接包含的本地或匿名类,则此方法返回null。
返回:
如果该类是本地或匿名类,则为基础类的直接封闭方法;否则为null。
public Constructor<?> getEnclosingConstructor()
如果此Class对象表示构造函数中的本地或匿名类,则返回一个Constructor对象,该对象表示基础类的直接封闭构造函数。否则返回null。特别是,如果基础类是由类型声明,实例初始化程序或静态初始化程序直接包含的本地或匿名类,则此方法返回null。
返回:
如果该类是本地或匿名类,则为基础类的直接封闭构造函数;否则为null。
public Class <?> getDeclaringClass()
如果此Class对象表示的类或接口是另一个类的成员,则返回表示声明它的类的Class对象。如果此类或接口不是任何其他类的成员,则此方法返回null。如果此Class对象表示数组类,基本类型或void,则此方法返回null。
返回:
这个类的声明类
getEnclosingClass
public Class <?> getEnclosingClass()
返回基础类的直接封闭类。如果底层类是顶级类,则此方法返回null。
返回:
基础类的直接封闭类
public String getSimpleName()
返回源代码中给出的基础类的简单名称。如果基础类是匿名的,则返回空字符串。
数组的简单名称是附加了“[]”的组件类型的简单名称。特别是组件类型为匿名的数组的简单名称是“[]”。

返回:
底层类的简单名称
public String getCanonicalName()
返回Java语言规范定义的基础类的规范名称。如果基础类没有规范名称(即,如果它是本地或匿名类或其组件类型不具有规范名称的数组),则返回null。
返回:
基础类的规范名称(如果存在),否则为null
public boolean isAnonymousClass()
当且仅当基础类是匿名类时返回true。
返回:
当且仅当此类是匿名类时才返回true
isLocalClass
public boolean isLocalClass()
当且仅当基础类是本地类时返回true。
返回:
当且仅当此类是本地类时才返回true
public boolean isMemberClass()
当且仅当底层类是成员类时返回true。
返回:
当且仅当此类是成员类时才返回true
public Class <?> [] getClasses()
返回一个数组,其中包含Class对象,这些对象表示作为此Class对象所表示的类的成员的所有公共类和接口。这包括从超类继承的公共类和接口成员,以及由类声明的公共类和接口成员。如果此Class对象没有公共成员类或接口,则此方法返回长度为0的数组。如果此Class对象表示基本类型,数组类或void,则此方法还返回长度为0的数组。
返回:
表示此类的公共成员的Class对象数组
抛出:
SecurityException - 如果存在安全管理器s且满足以下任何条件:
调用s.checkMemberAccess(this,Member.PUBLIC)方法拒绝访问此类中的类
调用者的类加载器与当前类的类加载器的祖先或祖先不同,并且s.checkPackageAccess()的调用拒绝访问此类的包
public Field [] getFields()
                 throws SecurityException
返回一个包含Field对象的数组,这些对象反映此Class对象所表示的类或接口的所有可访问公共字段。返回的数组中的元素没有排序,也没有任何特定的顺序。如果类或接口没有可访问的公共字段,或者它表示数组类,基本类型或void,则此方法返回长度为0的数组。
具体来说,如果此Class对象表示一个类,则此方法返回此类及其所有超类的公共字段。如果此Class对象表示接口,则此方法返回此接口及其所有超接口的字段。
此方法不反映数组类的隐式长度字段。用户代码应该使用类Array的方法来操作数组。
返回:
表示公共字段的Field对象数组
抛出:
SecurityException - 如果存在安全管理器s且满足以下任何条件:
调用s.checkMemberAccess(this,Member.PUBLIC)拒绝访问此类中的字段
调用者的类加载器与当前类的类加载器的祖先或祖先不同,并且s.checkPackageAccess()的调用拒绝访问此类的包
public Method [] getMethods()
                    throws SecurityException
返回一个包含Method对象的数组,这些对象反映此Class对象所表示的类或接口的所有公共成员方法,包括由类或接口声明的那些以及从超类和超接口继承的那些。数组类返回从Object类继承的所有(公共)成员方法。返回的数组中的元素没有排序,也没有任何特定的顺序。如果此Class对象表示没有公共成员方法的类或接口,或者此Class对象表示基本类型或void,则此方法返回长度为0的数组。
类初始化方法<clinit>不包含在返回的数组中。如果类声明具有相同参数类型的多个公共成员方法,则它们都包含在返回的数组中。
返回:
表示此类的公共方法的Method对象数组
抛出:
SecurityException - 如果存在安全管理器s且满足以下任何条件:
调用s.checkMemberAccessthisMember.PUBLIC)拒绝访问此类中的方法
调用者的类加载器与当前类的类加载器的祖先或祖先不同,并且s.checkPackageAccess()的调用拒绝访问此类的包
public Constructor <?> [] getConstructors()
                                 抛出SecurityException
返回一个包含Constructor对象的数组,这些对象反映此Class对象所表示的类的所有公共构造函数。如果类没有公共构造函数,或者类是数组类,或者类反映了基本类型或void,则返回长度为0的数组。请注意,虽然此方法返回一个Constructor <T>对象的数组(这是来自此类的构造函数数组),但此方法的返回类型是Constructor <?> []而不是Constructor <T> []。预期。这个信息量较少的返回类型是必需的,因为从此方法返回后,可以修改数组以保存不同类的Constructor对象,这将违反Constructor <T> []的类型保证。
返回:
表示此类的公共构造函数的Constructor对象数组
抛出:
SecurityException - 如果存在安全管理器s且满足以下任何条件:
调用s.checkMemberAccessthisMember.PUBLIC)拒绝访问此类中的构造函数
调用者的类加载器与当前类的类加载器的祖先或祖先不同,并且s.checkPackageAccess()的调用拒绝访问此类的包
public Field getField(String name)
               抛出NoSuchFieldException,
                      抛出:SecurityException
返回一个Field对象,该对象反映此Class对象所表示的类或接口的指定公共成员字段。 name参数是一个String,指定所需字段的简单名称。
要反映的字段由下面的算法确定。设C为此对象表示的类:

如果C声明一个具有指定名称的公共字段,那就是要反映的字段。
如果在上面的步骤1中没有找到字段,则该算法递归地应用于C的每个直接超接口。直接超接口按它们被声明的顺序搜索。
如果在上面的步骤12中没有找到字段,并且C具有超类S,则在S上递归调用该算法。如果C没有超类,则抛出NoSuchFieldException。
请参阅Java语言规范,第8.28.3节。
参数:
name - 字段名称
返回:
由name指定的此类的Field对象
抛出:
NoSuchFieldException - 如果找不到具有指定名称的字段。
NullPointerException - 如果name为null
SecurityException - 如果存在安全管理器s且满足以下任何条件:
调用s.checkMemberAccess(this,Member.PUBLIC)拒绝访问该字段
调用者的类加载器与当前类的类加载器的祖先或祖先不同,并且s.checkPackageAccess()的调用拒绝访问此类的包
public Method getMethod(String name,
               Class<?>... parameterTypes)
                 throws NoSuchMethodException,
                        SecurityException
返回一个Method对象,该对象反映此Class对象所表示的类或接口的指定公共成员方法。 name参数是一个String,指定所需方法的简单名称。 parameterTypes参数是一个Class对象数组,它按声明的顺序标识方法的形式参数类型。如果parameterTypesnull,则将其视为空数组。
如果名称为“<init>;”或“<clinit>”,则引发NoSuchMethodException。否则,要反映的方法由下面的算法确定。设C为此对象表示的类:

搜索C以寻找任何匹配方法。如果没有找到匹配方法,则在C的超类上递归调用步骤1的算法。
如果在上面的步骤1中没有找到方法,则搜索C的超接口以寻找匹配方法。如果找到任何这样的方法,则会反映出来。
要在类C中查找匹配方法:如果C只声明了一个具有指定名称和完全相同的形式参数类型的公共方法,那么这就是反映的方法。如果在C中找到多个这样的方法,并且这些方法中的一个具有比任何其他方法更具体的返回类型,则反映该方法;否则任意选择其中一种方法。
请注意,类中可能有多个匹配方法,因为虽然Java语言禁止类声明具有相同签名但返回类型不同的多个方法,但Java虚拟机却没有。虚拟机中增加的灵活性可用于实现各种语言功能。例如,可以使用桥接方法实现协变返回;桥接方法和被覆盖的方法将具有相同的签名但返回类型不同。
参数:
name - 方法的名称
parameterTypes - 参数列表
返回:
与指定的name和parameterTypes匹配的Method对象
抛出:
NoSuchMethodException - 如果找不到匹配的方法,或者名称是“<init>”或“<clinit>”。
NullPointerException - 如果namenull
SecurityException - 如果存在安全管理器s且满足以下任何条件:
调用s.checkMemberAccessthisMember.PUBLIC)拒绝访问该方法
调用者的类加载器与当前类的类加载器的祖先或祖先不同,并且s.checkPackageAccess()的调用拒绝访问此类的包
public Constructor<T> getConstructor(Class<?>... parameterTypes)
                              throws NoSuchMethodException,
                                     SecurityException
返回一个Constructor对象,该对象反映此Class对象所表示的类的指定公共构造函数。 parameterTypes参数是一个Class对象数组,它按声明的顺序标识构造函数的形式参数类型。如果此Class对象表示在非静态上下文中声明的内部类,则形式参数类型包括显式封闭实例作为第一个参数。
要反映的构造函数是此Class对象所表示的类的公共构造函数,其形式参数类型与parameterTypes指定的类型匹配。
参数:
parameterTypes - 参数数组
返回:
与指定的parameterTypes匹配的公共构造函数的Constructor对象
抛出:
NoSuchMethodException - 如果找不到匹配的方法。
SecurityException - 如果存在安全管理器s且满足以下任何条件:
调用s.checkMemberAccessthisMember.PUBLIC)拒绝访问构造函数
调用者的类加载器与当前类的类加载器的祖先或祖先不同,并且s.checkPackageAccess()的调用拒绝访问此类的包
public Class <?> [] getDeclaredClasses()
                            throws SecurityException
返回Class对象的数组,这些对象反映声明为此Class对象所表示的类的成员的所有类和接口。这包括公共,受保护,默认(包)访问以及类声明的私有类和接口,但不包括继承的类和接口。如果类声明没有类或接口作为成员,或者此Class对象表示基本类型,数组类或void,则此方法返回长度为0的数组。
返回:
Class对象的数组,表示此类的所有已声明成员
抛出:
SecurityException - 如果存在安全管理器s且满足以下任何条件:
调用s.checkMemberAccess(this,Member.DECLARED)拒绝访问此类中声明的类
调用者的类加载器与当前类的类加载器的祖先或祖先不同,并且s.checkPackageAccess()的调用拒绝访问此类的包
public Field [] getDeclaredFields()
                            throws SecurityException
返回Field对象的数组,这些对象反映由此Class对象表示的类或接口声明的所有字段。这包括公共,受保护,默认(包)访问和私有字段,但不包括继承的字段。返回的数组中的元素没有排序,也没有任何特定的顺序。如果类或接口声明没有字段,或者此Class对象表示基本类型,数组类或void,则此方法返回长度为0的数组。
请参阅Java语言规范,第8.2和8.3节。
返回:
Field对象数组,表示此类的所有声明字段
抛出:
SecurityException - 如果存在安全管理器s且满足以下任何条件:
调用s.checkMemberAccess(this,Member.DECLARED)拒绝访问此类中声明的字段
调用者的类加载器与当前类的类加载器的祖先或祖先不同,并且s.checkPackageAccess()的调用拒绝访问此类的包
public Method [] getDeclaredMethods()
                            throws SecurityException
返回一个Method对象数组,反映由此Class对象表示的类或接口声明的所有方法。这包括公共,受保护,默认(包)访问和私有方法,但不包括继承的方法。返回的数组中的元素没有排序,也没有任何特定的顺序。如果类或接口未声明任何方法,或者此Class对象表示基本类型,数组类或void,则此方法返回长度为0的数组。类初始化方法<clinit>不包含在返回的数组中。如果类声明具有相同参数类型的多个公共成员方法,则它们都包含在返回的数组中。
请参阅Java语言规范,第8.2节。
返回:
表示此类的所有声明方法的Method对象数组
抛出:
SecurityException - 如果存在安全管理器s且满足以下任何条件:
调用s.checkMemberAccessthisMember.DECLARED)拒绝访问此类中声明的方法
调用者的类加载器与当前类的类加载器的祖先或祖先不同,并且s.checkPackageAccess()的调用拒绝访问此类的包
public Constructor <?> [] getDeclaredConstructors()
                            throws SecurityException
返回Constructor对象的数组,这些对象反映由此Class对象表示的类声明的所有构造函数。这些是公共,受保护,默认(包)访问和私有构造函数。返回的数组中的元素没有排序,也没有任何特定的顺序。如果类具有默认构造函数,则它包含在返回的数组中。如果此Class对象表示接口,基本类型,数组类或void,则此方法返回长度为0的数组。
请参阅Java语言规范,第8.2节。
返回:
表示此类的所有已声明构造函数的Constructor对象数组
抛出:
SecurityException - 如果存在安全管理器s且满足以下任何条件:
调用s.checkMemberAccessthisMember.DECLARED)拒绝访问此类中声明的构造函数
调用者的类加载器与当前类的类加载器的祖先或祖先不同,并且s.checkPackageAccess()的调用拒绝访问此类的包
public Field getDeclaredField(String name)
                       throws NoSuchFieldException,
                              SecurityException
返回一个Field对象,该对象反映此Class对象所表示的类或接口的指定声明字段。 name参数是一个String,它指定所需字段的简单名称。请注意,此方法不会反映数组类的长度字段。
参数:
name - 字段的名称
返回:
此类中指定字段的Field对象
抛出:
NoSuchFieldException - 如果找不到具有指定名称的字段。
NullPointerException - 如果name为null
SecurityException - 如果存在安全管理器s且满足以下任何条件:
调用s.checkMemberAccess(this,Member.DECLARED)拒绝访问声明的字段
调用者的类加载器与当前类的类加载器的祖先或祖先不同,并且s.checkPackageAccess()的调用拒绝访问此类的包
public Method getDeclaredMethod(String name,
                       Class<?>... parameterTypes)
                         throws NoSuchMethodException,
                                SecurityException
返回一个Method对象,该对象反映此Class对象所表示的类或接口的指定声明方法。 name参数是一个String,它指定所需方法的简单名称,parameterTypes参数是一个Class对象数组,用于按声明的顺序标识方法的形式参数类型。如果在类中声明了多个具有相同参数类型的方法,并且其中一个方法的返回类型比任何其他方法更具体,则返回该方法;否则任意选择其中一种方法。如果名称为“<init>”或“<clinit>”,则引发NoSuchMethodException。
参数:
name - 方法的名称
parameterTypes - 参数数组
返回:
此类的方法的Method对象与指定的名称和参数匹配
抛出:
NoSuchMethodException - 如果找不到匹配的方法。
NullPointerException - 如果namenull
SecurityException - 如果存在安全管理器s且满足以下任何条件:
调用s.checkMemberAccessthisMember.DECLARED)拒绝访问声明的方法
调用者的类加载器与当前类的类加载器的祖先或祖先不同,并且s.checkPackageAccess()的调用拒绝访问此类的包
public Constructor <T> getDeclaredConstructor(Class <?> ... parameterTypes)
                                            throws NoSuchMethodException,
                                            SecurityException
返回一个Constructor对象,该对象反映此Class对象所表示的类或接口的指定构造函数。 parameterTypes参数是一个Class对象数组,它按声明的顺序标识构造函数的形式参数类型。如果此Class对象表示在非静态上下文中声明的内部类,则形式参数类型包括显式封闭实例作为第一个参数。
参数:
parameterTypes - 参数数组
返回:
具有指定参数列表的构造函数的Constructor对象
抛出:
NoSuchMethodException - 如果找不到匹配的方法。
SecurityException - 如果存在安全管理器s且满足以下任何条件:
调用s.checkMemberAccess(this,Member.DECLARED)拒绝访问声明的构造函数
调用者的类加载器与当前类的类加载器的祖先或祖先不同,并且s.checkPackageAccess()的调用拒绝访问此类的包
public InputStream getResourceAsStream(String name)
查找具有给定名称的资源。搜索与给定类关联的资源的规则由类的定义类加载器实现。此方法委托给该对象的类加载器。如果此对象由引导类加载器加载,则该方法委托给ClassLoader.getSystemResourceAsStream(java.lang.String)。
在委派之前,使用此算法从给定资源名称构造绝对资源名称:
如果名称以'/''\ u002f')开头,则资源的绝对名称是'/'后面的名称部分。
否则,绝对名称具有以下形式:
modified_pa​​ckage_name /名称
其中modified_pa​​ckage_name是此对象的包名称,其中'/'替换为'。''\ u002e')。
参数:
name - 所需资源的名称
返回:
一个InputStream对象,如果找不到具有此名称的资源,则返回null
抛出:
NullPointerException - 如果name为null
public URL getResource(String name)
查找具有给定名称的资源。搜索与给定类关联的资源的规则由类的定义类加载器实现。此方法委托给该对象的类加载器。如果此对象由引导类加载器加载,则该方法委托给ClassLoader.getSystemResource(java.lang.String)。
在委派之前,使用此算法从给定资源名称构造绝对资源名称:

如果名称以'/''\ u002f')开头,则资源的绝对名称是'/'后面的名称部分。
否则,绝对名称具有以下形式:
modified_pa​​ckage_name /名称
其中modified_pa​​ckage_name是此对象的包名称,其中'/'替换为'。''\ u002e')。

参数:
name - 所需资源的名称
返回:
URL对象,如果未找到具有此名称的资源,则为null
public ProtectionDomain getProtectionDomain()
返回此类的ProtectionDomain。如果安装了安全管理器,则此方法首先使用RuntimePermission(“getProtectionDomain”)权限调用安全管理器的checkPermission方法,以确保可以获取ProtectionDomain。
返回:
此类的ProtectionDomain
抛出:
SecurityException - 如果存在安全管理器且其checkPermission方法不允许获取ProtectionDomain。
public boolean desiredAssertionStatus()
如果要在调用此方法时初始化,则返回将分配给此类的断言状态。如果此类已设置其断言状态,则将返回最新的设置;否则,如果任何包默认断言状态属于此类,则返回最具体的相关包默认断言状态的最新设置;否则,如果此类不是系统类(即,它具有类加载器),则返回其类加载器的默认断言状态;否则,返回系统类的默认断言状态。
很少有程序员需要这种方法;它是为了JRE本身的利益而提供的。 (它允许类在初始化时确定是否应该启用断言。)请注意,此方法不保证返回与指定类关联的(或将要)关联的实际断言状态(或将被初始化。
返回:
指定类的所需断言状态。
public boolean isEnum()
当且仅当此类在源代码中声明为枚举时返回true。
返回:
当且仅当此类在源代码中声明为枚举时才返回true
public T [] getEnumConstants()
返回此枚举类的元素,如果此Class对象不表示枚举类型,则返回null。
返回:
包含由此Class对象按其声明的顺序表示的枚举类的值的数组,如果此Class对象不表示枚举类型,则返回null
public T cast(Object obj)
将对象强制转换为此Class对象所表示的类或接口。
参数:
obj - 要投射的对象
返回:
转换后的对象,如果obj为null,则返回null
抛出:
ClassCastException - 如果对象不为null且不能分配给类型T.
public <U> Class<? extends U> asSubclass(Class<U> clazz)
转换此Class对象以表示由指定的类对象表示的类的子类。检查强制转换是否有效,如果不是则抛出ClassCastException。如果此方法成功,则它始终返回对此类对象的引用。
当客户端需要“缩小”Class对象的类型以将其传递给限制其愿意接受的Class对象的API时,此方法很有用。强制转换将生成编译时警告,因为无法在运行时检查强制转换的正确性(因为泛型类型是通过擦除实现的)。

返回:
这个Class对象,强制转换为表示指定类对象的子类。
抛出:
ClassCastException - 如果此Class对象不表示指定类的子类(此处“子类”包括类本身)。
public <A extends Annotation> getAnnotationClass <A> annotationClass)
从interfaceAnnotatedElement复制的描述
如果存在这样的注释,则返回指定类型的此元素的注释,否则返回null。
具体说明:
接口AnnotatedElement中的getAnnotation
参数:
annotationClass - 与注释类型对应的Class对象
返回:
如果此元素上存在指定注释类型,则此元素的注释,否则为null
抛出:
NullPointerException - 如果给定的注释类为null
public boolean isAnnotationPresent(Class <?extends Annotation> annotationClass)
从interfaceAnnotatedElement复制的描述
如果此元素上存在指定类型的注释,则返回true,否则返回false。此方法主要用于方便地访问标记注释。
具体说明:
接口AnnotatedElement中的isAnnotationPresent
参数:
annotationClass - 与注释类型对应的Class对象
返回:
如果此元素上存在指定注释类型的注释,则返回true,否则返回false
抛出:
NullPointerException - 如果给定的注释类为null
public Annotation [] getAnnotations()
从interface:AnnotatedElement复制的描述
返回此元素上存在的所有注释。 (如果此元素没有注释,则返回长度为零的数组。)此方法的调用者可以自由修改返回的数组;它对返回给其他调用者的数组没有影响。
具体说明:
接口AnnotatedElement中的getAnnotations
返回:
此元素上的所有注释
public Annotation [] getDeclaredAnnotations()
从interface:AnnotatedElement复制的描述
返回直接出现在此元素上的所有注释。与此接口中的其他方法不同,此方法忽略继承的注释。 (如果此元素上没有直接出现注释,则返回长度为零的数组。)此方法的调用者可以自由修改返回的数组;它对返回给其他调用者的数组没有影响。
具体说明:
接口AnnotatedElement中的getDeclaredAnnotations
返回:
所有注释都直接出现在此元素上

猜你喜欢

转载自blog.csdn.net/weixin_39923324/article/details/82222993