1. Class 类
该类的实例表示正在运行的 Java 应用程序中的类和接口(运行时的状态).
Java 程序在运行时, 系统一直对所有的对象进行运行时类型标识(信息).
这项信息纪录了每个对象所属的类. JVM 通过运行时类型信息选择正确方法去执行,
用来保存这些运行时类型信息的是Class
类对象.当装载类时,
Class
类型对象会通过 JVM 自动创建.Class
没有公共构造方法.Class
对象是在加载类时,
由 JVM 以及通过调用类加载器中的defineClass
方法自动构造的,
因此Class
对象不能显式地声明.
1.1. Class 类的实例
- Class 实例表示在 JVM 中的类或者接口.
- 实际上就是 JVM 中的一份份字节码.
1.1.1. 实例分类
枚举是一种类, 注释是一种接口.
每个数组属于被映射为
Class
对象的一个类, 所有具有相同元素类型
和维数的数组都共享该Class
对象.基本的 Java 类型
boolean, byte, char, short, int, long, float, double
和关键字void
也表示为Class
对象.
2. Class 常用方法
2.1. 一般类或接口对象的 Class 对象的获取
- 由于
Class
对象不能显式地声明. 因此需要有方法进行返回该类对象.
2.1.1. 方式 1
- 调用
Object
类的getClass()
方法来得到Class
对象.MyObject x; Class c1 = x.getClass();
2.1.2. 方式 2
- 使用
Class
类的中静态forName()
方法获得与字符串对应的Class
对象.Class c2 = Class.forName("MyObject");
2.1.3. 方式 3
- 如果
T
是一个 Java 类型, 那么T.class
就代表了匹配的类对象.Class cl1 = Manager.class; Class cl2 = int.class; Class cl3 = Double[].class;
2.1.4. 注意事项
每份字节码文件 JVM 只会创建一个
Class
对象, 这个对象是唯一的.Class
对象实际上描述的只是类型, 而这类型未必是类或者接口.
例如上面int.class
是一个Class
类型的对象.由于历史原因, 数组类型的
getName()
方法会返回奇怪的名字.
2.2. 九大内置 Class 对象的获取
由于基本数据类型不能表示为对象, 就不能用
getClass()
方法,
基本类型也没有类名的概念, 因此也不可以使用Class.forName()
的方式.但是所有数据类型都有 class 属性, 因此基本数据类型可以调用这个属性.
这是因为 JAVA 中内置了九大 Class 实例, 可以提供调用.
这些实例对应boolean, byte, char, short, int, long, float, double, void
. 因此基本类型的class
属性就是从这些内置的实例进行获取的.在 8 大基本数据类型对应的包装类中, 都存在一个
TYPE
常量,
这个常量用于返回该包装类对应基本类型的字节码对象.
2.3. 数组的 Class 实例的获取
数组是引用数据类型, 因此数组本质上是对象.
但数组也没有类名的概念, 因此只能调用
class
属性
和getClass()
方法进行获取Class
实例.注意:
所有具有相同数据类型和数组维数的数组都共享同一个Class
对象和数组内元素没有关系.int[] arr1 = {1,2,3}; int[] arr2 = {1,1,1,1,1,1,1,1,1,1}; //输出为 TRUE System.out.println(arr1.getClass() == arr2.getClass());