Class类
1. 基本介绍
(1)Class 也是类,因此也继承 Object 类
(2)Class 类对象不是 new 出来的,而是系统创建的
(3)对于某个类的 Class 类对象,在内存中只有一个,因为类只加载一次
(4)每个类的实例都会记得自己是由哪个 Class 实例所生成
(5)通过 Class 对象可以完整地得到一个类的完整结构, 通过一系列 API
(6)Class 对象是存放在堆的
(7)类的字节码二进制数据,是放在方法区的,有的地方称为类的元数据(包括 方法代码,变量名,方法名,访问权限等等)
2. 类图

3. 常用方法
| 方法名 | 功能说明 |
|---|---|
| forName(String name) | 返回指定类名 name 的 Class 对象。 |
| newInstance() | 调用被构造函数,返回该 Class 对象的一个实例。 |
| set(类对象实例,属性(字符串)) | 获得某个类的属性对象后,可以通过 set 方法设置值,不改变源码 |
| getName() | 返回此 Class 对象所表示的实体(类、接口、数组、基本类型等)名称,不传入参数则获取全类名 |
| getPackage().getName() | 获取包名 |
| getMethod(String name, Class... paramTypes) | 返回一个 Method 对象,此对象的形参类型为 paramTypes。 |
| getClassLoader() | 返回该类的类加载器。 |
| getSuperclass() | 返回表示此 Class 所表示的实体的**父类(超类 / 基类)**的 Class 对象。 |
| Field[] getDeclaredFields()() | 返回 Field 对象的一个数组。 |
| Constructor[] getConstructors()() | 返回一个包含某些 Constructor 对象的数组。 |
| Class[] getInterfaces() | 获取当前 Class 对象实现的所有接口。 |
补充:<?>
拿到该类的 Class 对象后,表示 Class 对象的类型是不确定的
4. 获取类对象的方法
(1)forName()
阶段:编译阶段(对应反射原理图)
前提: 已知一个类的全类名,且该类在类路径下,可通过 Class 类的 静态方法 forName() 获取,可能抛出 ClassNotFoundException 异常
应用场景: 多用于配置文件, 读取类全路径,加载类.
java
public class reflect {
public static void main(String[] args) throws Exception {
String filePath = "src/properties";
// 获取文件的 Class 对象
Class cls = Class.forName(filePath);
}
}(2)class()
前提: 若已知具体的类,通过类的 class 获取,该方式最为安全可靠,程序性能最高
应用场景: 多用于参数传递,比如通过反射得到对应构造器对象.
实例: Class cls2 = Cat.class
(3)getClass()
阶段:运行阶段(对应反射原理图)
前提: 已知某个类的实例,调用该实例的 getClass()方法获取 Class 对象
应用场景: 通过创建好的对象,获取 Class 对象.
实例: Class clazz = 对象.getClass()
(4)loadClass()
思路分析:因为通过类加载器加载后可以通过获取类的 Class 对象,所以获得该类的类加载器,然后用类加载器加载获得 Class 对象
通过Class 对象获得该类的类加载器:getClassLoader()
通过加载器的方法:loadClass()
java
public class reflect {
public static void main(String[] args) throws Exception {
String classPath = "reflect.Dog";
Dog dog = new Dog();
// 首先拿到该类的加载器
ClassLoader classLoader = dog.getClass().getClassLoader();
// 通过类加载器获得该类的 Class 对象
Class cls = classLoader.loadClass(classPath);
// 输出该类的 Class 对象
System.out.println(cls);
}
}(5)基本数据类型
公式:Class cls = 基本数据类型.class
(6)包装类
公式:Class cls = 包装类.TYPE
⚠️ 注意点
java
public class reflect {
public static void main(String[] args) throws Exception {
// 基本数据类型
Class<Integer> integerClass = int.class;
Class<Character> characterClass = char.class;
// 包装类
Class<Integer> type = Integer.TYPE;
Class<Character> type1 = Character.TYPE;
System.out.println(integerClass.hashCode());
System.out.println(type.hashCode());
}
}
// 输出结果
1163157884
1163157884结论:基本数据类型和包装类在底层会实现自动装箱和自动拆箱,二者的 Class 对象相同
5. 哪些类型有 Class 对象

