hooyantsing's Blog

探究Class类

字数统计: 610阅读时长: 2 min
2020/05/22

Class类

探究Class类


**参考: **

https://blog.csdn.net/liuxiao723846/article/details/90346160?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

Class类相当于这个类所有实例的代言人,它包含有关这个类的详细信息。

Class类的对象作用是运行时提供或获得某个对象的类型信息,这点对于反射技术很重要。

在Java中用来表示运行时类型信息的对应类就是Class类,Class类也是一个实实在在的类,存在于JDK的java.lang包中。

我们写的.java类文件经过编译,创建一个Class对象并写入到同名.class字节码文件里。即编译后的字节码文件保存的就是Class对象。

Class对象的作用

当我们new一个新对象或者引用静态成员变量时,Java虚拟机(JVM)中的类加载器子系统会将对应Class对象(实际上加载的就是这个类的字节码文件)加载到JVM中,然后JVM再根据这个Class对象创建我们需要的实例对象或者提供静态变量的引用值。

无论创建多少个实例对象,在JVM中都只有一个Class对象与其对应,即在内存中每个类有且仅有一个相对应的Class对象。

e6233a8ca749b8db18b598bc9af1cb6a.png

Class类只有私有构造函数,因此对应Class对象只能有JVM创建和加载。

JVM是懒加载,当要用到的类才将其加载到JVM里。

三种方式获取Class对象

Class.forName:特点是无需通过持有该类的实例对象引用而获取Class对象。通俗的说,JVM懒加载还没有加载某一个类,这时叫JVM去把这个类加载进来。

实例对象.getClass(): getClass方法从顶级类Object继承而来的,获取这个类的Class对象。

类名.class:更简单安全高效。通过字面量的方式获取Class对象的引用不会自动初始化该类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public static void main(String[] args) {

try{
    //通过Class.forName获取Gum类的Class对象
    Class clazz=Class.forName("com.zejian.Gum");
    System.out.println("forName=clazz:"+clazz.getName());
}catch (ClassNotFoundException e){
    e.printStackTrace();
}

//通过实例对象获取Gum的Class对象
Gum gum = new Gum();
Class clazz2=gum.getClass();
System.out.println("new=clazz2:"+clazz2.getName());

//字面常量的方式获取Class对象
Class clazz3 = Gum.class;
System.out.println("new=clazz3:"+clazz3.getName());

}
CATALOG