Class 类
java.lang.Class<T>
介绍
T
- 由此 Class
对象建模的类的类型。例如, String.class
的类型是 Class<String>
。如果将被建模的类未知,则使用 Class<?>
。
Class
类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class
对象。基本的 Java 类型(boolean
、byte
、char
、short
、int
、long
、float
和 double
)和关键字 void
也表示为 Class
对象。
Class
没有公共构造方法。Class
对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass
方法自动构造的。
以下示例使用 Class
对象来显示对象的类名:
void printClassName(Object obj) {
System.out.println("The class of " + obj +
" is " + obj.getClass().getName());
}
还可以使用一个类字面值(JLS Section 15.8.2)来获取指定类型(或 void)的 Class
对象。例如:
System.out.println("The name of class Foo is: "+Foo.class.getName());
方法public StringtoString()
- 将对象转换为字符串。字符串的表示形式为字符串 "class" 或 "interface" 后面紧跟一个空格,然后是该类的完全限定名,它具有
getName
返回的那种格式。如果此Class
对象表示一个基本类型,则此方法返回该基本类型的名称。如果该Class
对象表示 void,则此方法返回 "void" public static Class<?> forName(String className) throws ClassNotFoundException
返回与带有给定字符串名的类或接口相关联的Class
对象。调用此方法等效于:
其中Class.forName(className, true, currentLoader)currentLoader
表示当前类的定义类加载器。例如,以下代码片段返回命名为
java.lang.Thread
的类的运行时Class
描述符。Class t = Class.forName("java.lang.Thread")
-
调用 forName("X") 将导致命名为 X 的类被初始化。
参数:
className
- 所需类的完全限定名。
-
- 返回:
- 具有指定名的类的
Class
对象。 - 抛出:
LinkageError
- 如果链接失败ExceptionInInitializerError
- 如果此方法所激发的初始化失败ClassNotFoundException
- 如果无法定位该类-
public T newInstance() throws InstantiationException, IllegalAccessException- 创建此 Class 对象所表示的类的一个新实例。如同用一个带有一个空参数列表的
new
表达式实例化该类。如果该类尚未初始化,则初始化这个类。注意,此方法传播 null 构造方法所抛出的任何异常,包括已检查的异常。使用此方法可以有效地绕过编译时的异常检查,而在其他情况下编译器都会执行该检查。
Constructor.newInstance
方法将该构造方法所抛出的任何异常包装在一个(已检查的)InvocationTargetException
中,从而避免了这一问题。返回:
-
此对象所表示的类的一个新分配的实例。
isInterface
public boolean isInterface()
- 判定指定的
Class
对象是否表示一个接口类型。 -
isArray
public boolean isArray()
- 判定此
Class
对象是否表示一个数组类。 -
isPrimitive
public boolean isPrimitive()
- 判定指定的
Class
对象是否表示一个基本类型。有九种预定义的
Class
对象,表示八个基本类型和 void。这些类对象由 Java 虚拟机创建,与其表示的基本类型同名,即boolean
、byte
、char
、short
、int
、long
、float
和double
。这些对象仅能通过下列声明为 public static final 的变量访问,也是使此方法返回
true
的仅有的几个Class
对象。getClassLoader
public ClassLoader getClassLoader()
- 返回该类的类加载器。有些实现可能使用 null 来表示引导类加载器。如果该类由引导类加载器加载,则此方法在这类实现中将返回 null。
如果存在安全管理器,并且调用者的类加载器不是 null,也不同于或是请求其类加载器的类的类加载器的祖先,则此方法通过
RuntimePermission("getClassLoader")
权限调用此安全管理器的checkPermission
方法,以确保可以访问该类的类加载器。如果此对象表示一个基本类型或 void,则返回 null。
- 返回:
- 加载此对象所表示的类或接口的类加载器。
-
getPackage
public Package getPackage()
- 获取此类的包。此类的类加载器用于查找该包。如果该类是通过引导类加载器加载的,则搜索从 CLASSPATH 加载的包的集合,以查找该类的包。如果所有包对象都不是用该类的类加载器加载的,则返回 null。
只有该类的附属清单中定义了信息,并且类加载器使用该清单中的属性创建了包实例时,包才具有版本和规范属性。
- 返回:
- 该类的包,如果存档或基本代码中没有可用的包信息,则返回 null。
-
getFields
public Field[] getFields() throws SecurityException
- 返回一个包含某些
Field
对象的数组,这些对象反映此Class
对象所表示的类或接口的所有可访问公共字段。返回数组中的元素没有排序,也没有任何特定的顺序。如果类或接口没有可访问的公共字段,或者表示一个数组类、一个基本类型或 void,则此方法返回长度为 0 的数组。特别地,如果该
Class
对象表示一个类,则此方法返回该类及其所有超类的公共字段。如果该Class
对象表示一个接口,则此方法返回该接口及其所有超接口的公共字段。该方法不反映数组类的隐式长度字段。用户代码应使用
Array
类的方法来操作数组。请参阅 Java Language Specification 的第 8.2 和 8.3 节。
- 返回:
- 表示公共字段的
Field
对象的数组 -
getMethods
public Method[] getMethods() throws SecurityException
- 返回一个包含某些
Method
对象的数组,这些对象反映此Class
对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。数组类返回从Object
类继承的所有(公共)member 方法。返回数组中的元素没有排序,也没有任何特定的顺序。如果此Class
对象表示没有公共成员方法的类或接口,或者表示一个基本类型或 void,则此方法返回长度为 0 的数组。类初始化方法
<clinit>
不包含在返回的数组中。如果类声明了带有相同参数类型的多个公共成员方法,则它们都会包含在返回的数组中。请参阅 Java Language Specification 的第 8.2 和 8.4 节。
- 返回:
- 表示此类中公共方法的
Method
对象的数组 -
getConstructors
public Constructor<?>[] getConstructors() throws SecurityException
- 返回一个包含某些
Constructor
对象的数组,这些对象反映此Class
对象所表示的类的所有公共构造方法。如果该类没有公共构造方法,或者该类是一个数组类,或者该类反映一个基本类型或 void,则返回一个长度为 0 的数组。 注意,此方法返回Constructor<T>
对象的数组(即取自此类构造方法的数组)时,此方法的返回类型是Constructor<?>[]
, 不是 预期的Constructor<T>[]
。此少量信息的返回类型是必需的,因为从此方法返回之后,该数组可能被修改以保存不同类的Constructor
对象,而这将违反Constructor<T>[]
的类型保证。 - 返回:
- 表示此类公共构造方法的
Constructor
对象数组 -
getField
public Field getField(String name) throws NoSuchFieldException, SecurityException
- 返回一个
Field
对象,它反映此Class
对象所表示的类或接口的指定公共成员字段。name
参数是一个String
,用于指定所需字段的简称。要反映的字段由下面的算法确定。设 C 为此对象所表示的类:
- 如果 C 声明一个带有指定名的公共字段,则它就是要反映的字段。
- 如果在第 1 步中没有找到任何字段,则该算法被递归地应用于 C 的每一个直接超接口。直接超接口按其声明顺序进行搜索。
- 如果在第 1、2 两步没有找到任何字段,且 C 有一个超类 S,则在 S 上递归调用该算法。如果 C 没有超类,则抛出
NoSuchFieldException
。
请参阅 Java Language Specification 的第 8.2 和 8.3 节。
- 参数:
name
- 字段名- 返回:
- 由
name
指定的该类的Field
对象 -
getMethod
public Method getMethod(String name, Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException
- 返回一个
Method
对象,它反映此Class
对象所表示的类或接口的指定公共成员方法。name
参数是一个String
,用于指定所需方法的简称。parameterTypes
参数是按声明顺序标识该方法形参类型的Class
对象的一个数组。如果parameterTypes
为null
,则按空数组处理。如果
name
是 "<init>
;" 或 "<clinit>
",则将引发NoSuchMethodException
。否则,要反映的方法由下面的算法确定(设 C 为此对象所表示的类):- 在 C 中搜索任一匹配的方法。如果找不到匹配的方法,则将在 C 的超类上递归调用第 1 步算法。
- 如果在第 1 步中没有找到任何方法,则在 C 的超接口中搜索匹配的方法。如果找到了这样的方法,则反映该方法。
注意,类中可以有多个匹配方法,因为尽管 Java 语言禁止类声明带有相同签名但不同返回类型的多个方法,但 Java 虚拟机并不禁止。这增加了虚拟机的灵活性,可以用来实现各种语言特性。例如,可以使用桥方法 (brige method)实现协变返回;桥方法以及将被重写的方法将具有相同的签名,不同的返回类型。
请参阅Java 语言规范 第 8.2 和 8.4 节。
- 参数:
name
- 方法名parameterTypes
- 参数列表- 返回:
- 与指定的
name
和parameterTypes
匹配的Method
对象 -
getConstructor
public Constructor<T> getConstructor(Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException
- 返回一个
Constructor
对象,它反映此Class
对象所表示的类的指定公共构造方法。parameterTypes
参数是Class
对象的一个数组,这些 Class 对象按声明顺序标识构造方法的形参类型。 如果此Class
对象表示非静态上下文中声明的内部类,则形参类型作为第一个参数包括显示封闭的实例。要反映的构造方法是此
Class
对象所表示的类的公共构造方法,其形参类型与parameterTypes
所指定的参数类型相匹配。 - 参数:
parameterTypes
- 参数数组- 返回:
- 与指定的
parameterTypes
相匹配的公共构造方法的Constructor
对象 -
- 返回一个
- 返回一个
- 返回一个
- 返回一个包含某些
- 返回一个包含某些
- 返回一个包含某些
- 获取此类的包。此类的类加载器用于查找该包。如果该类是通过引导类加载器加载的,则搜索从 CLASSPATH 加载的包的集合,以查找该类的包。如果所有包对象都不是用该类的类加载器加载的,则返回 null。
- 返回该类的类加载器。有些实现可能使用 null 来表示引导类加载器。如果该类由引导类加载器加载,则此方法在这类实现中将返回 null。
- 判定指定的
- 判定此
- 判定指定的
- 创建此 Class 对象所表示的类的一个新实例。如同用一个带有一个空参数列表的