Class类
1、概述
- java中除了基本类型: byte,short,int,long,float,double,boolean,char ,之外的其他类型都是
class
。但JVM也为每一种基本类擦黄建了Class,例如可通过int.class
访问。
注:什么是class
?
class
(包括interface
)的本质就是数据类型
,Class
其实也是一个名字叫Class
的class
public final class Class {
private Class() {}
}
- 所有的java类型都继承自Object类,Object类中有一个方法
getClass()
来取得一个指向Class类得对象的引用。
Class
的构造函数是private
限定符修饰的,因此只能在各类被调用时,由JVM在运行时自动创建Class对象(或者是defineClass类加载器中的方法自动构造对象),我们生成的对象都会有一个字段记录该对象所属类在Class类的对象的所在位置,反过来说就是JVM持有的每一个Class类型实例都指向了一个数据类型(class
或interface
)
2、Class类型的实例
- 包含了该class的所有完整信息
Class Instance |
---|
name |
package |
super |
interface |
field |
method |
- 获取方法
- 直接通过一个
class
(类
)的静态变量class
获取 - 如果我们有一个
实例
变量,可以通过该实例变量提供的getClass()
方法获取 - 如果知道一个
class
(类)
的完整类名,可以通过静态方法Class.forName()
获取
3、判断是否为同类(子类)
1. instance of
不但匹配指定类型,还匹配指定类型的子类
Integer n = new Integer(123);
boolean b1 = n instanceof Integer; // true,因为n是Integer类型
boolean b2 = n instanceof Number; // true,因为Integer是Number类型的子类
2. ==
精确的判断数据类型,不能用来匹配子类型
Integer n = new Integer(123);
boolean b3 = n.getClass() == Integer.class; // true,因为n.getClass()返回Integer.class
boolean b4 = n.getClass() == Number.class; // false,因为Integer.class!=Number.class
4、总结
- JVM为每个加载的class以及interface创建对应的Class实例来保存class以及interface的所有信息
- 获取一个class对应的Class实例后,就可以获取该Class的所有信息
- JVM总是动态加载class,因此可以在运行期间根据条件来控制加载class