Skip to content

Class类


1. 基本介绍

(1)Class 也是类,因此也继承 Object 类

(2)Class 类对象不是 new 出来的,而是系统创建

(3)对于某个类的 Class 类对象,在内存中只有一个,因为类只加载一次

(4)每个类的实例都会记得自己是由哪个 Class 实例所生成

(5)通过 Class 对象可以完整地得到一个类的完整结构, 通过一系列 API

(6)Class 对象是存放在

(7)类的字节码二进制数据,是放在方法区的,有的地方称为类的元数据(包括 方法代码,变量名,方法名,访问权限等等)

2. 类图

alt text

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()

阶段:编译阶段(对应反射原理图)

  1. 前提: 已知一个类的全类名,且该类在类路径下,可通过 Class 类的 静态方法 forName() 获取,可能抛出 ClassNotFoundException 异常

  2. 应用场景: 多用于配置文件, 读取类全路径,加载类.

java
public class reflect {
    public static void main(String[] args) throws Exception {
        String filePath  = "src/properties";
        // 获取文件的 Class 对象
        Class cls = Class.forName(filePath);
    }
}

(2)class()

  1. 前提: 若已知具体的类,通过类的 class 获取,该方式最为安全可靠,程序性能最高

  2. 应用场景: 多用于参数传递,比如通过反射得到对应构造器对象.

实例: Class cls2 = Cat.class

(3)getClass()

阶段:运行阶段(对应反射原理图)

  1. 前提: 已知某个类的实例,调用该实例的 getClass()方法获取 Class 对象

  2. 应用场景: 通过创建好的对象,获取 Class 对象.

实例: Class clazz = 对象.getClass()

(4)loadClass()

思路分析:因为通过类加载器加载后可以通过获取类的 Class 对象,所以获得该类的类加载器,然后用类加载器加载获得 Class 对象

  1. 通过Class 对象获得该类的类加载器getClassLoader()

  2. 通过加载器的方法: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 对象

alt text