类的生命周期和类加载器

类的生命周期

1.加载

  • 找到.class文件,获取定义此类的二进制字节流
  • jvm读取.class文件中的信息和数据,把这些信息和数据转化到内存方法区中
  • 在内存中生成一个与该类相关的一个类对象,运行时类的实例
  • Class:也是一个类,是一个特殊的类,用来描述类信息的一个类

2.验证

  • 文件格式验证
  • 元数据验证
  • 字节码验证
  • 符号引用验证

3.准备
1.如果java文件中有static修饰的变量,那么在这个阶段,jvm就开始为它分配内存,以及对它进行初始化值
比如:
public static int num=123;//这里的num不是一步到位,分成两个阶段完成(准备和类初始化),在准备阶段只是分配了内存,并且分配一个默认值num=0;在初始化阶段才会赋值123.
对于static final类型,在准备阶段会直接赋予正确的值,因为它是常量。

4.解析
把常量池内的符号引用替换为直接引用
String a=b;
把b的引用地址直接给到a的身上
验证,准备,解析可以统称为链接
5.初始化:这里指类的初始化

  • 把在准备阶段的类变量赋予正确的值,执行静态代码块的内容(类初始化代码块)
  • 判断有没有子类,如果有子类,保证子类的父类要先被初始化
  • 当访问一个静态域时,只有真正声明这个域的类才会被初始化。如当通过子类引用父类的静态变量,不会导致子类初始化。
  • 引用常量不会触发此类的初始化(常量在链接阶段就存入调用类的常量池中了)

6.使用
平常对类的一些使用
7.卸载
由垃圾回收机制来实现

类加载器

类的生命周期跟类的加载器有关
类加载器负责将.class文件加载到内存中,并生成对应的java.lang.class类对象
类加载器得到分类:
1.启动类加载器:靠本地方法(c,c++)把jdk/jre/lib包下面的jar包加载到内存中
2.扩展类加载器
3.系统类加载器
理解为程序员自定义的类,由系统类加载器加载到内存中

双亲委派:指类加载器之间的关系
1.扩展类加载器是系统类加载器的父类
2.扩展类加载器和系统类加载器也是由启动类加载器间接实现的

三个加载器的执行流程:
1.最先启动启动类加载器,就启动这一个就搞定了
2.启动类加载器不满足的时候,开始启动扩展类加载器
3.如果前面两种都不满足,启动系统类加载器,把我们自定义的类加载到内存中

public class ClassLoaderTest {
    public static void main(String[] args) throws ClassNotFoundException {
        //获得系统的类加载器
        ClassLoader classLoader = ClassLoader.getSystemClassLoader();
        //获得系统的类加载器的父类(拓展类加载器)
        ClassLoader parent = classLoader.getParent();
        //获得拓展类加载器的父类(启动类加载器)
        ClassLoader parent1 = parent.getParent();

        //加载类 还没有进入准备阶段
        classLoader.loadClass("thread.Productor");

        //准备阶段并分配内存  方法区
        Class<?> forName = Class.forName("thread.Productor");
        //测试当前类是由哪个加载器加载的
        ClassLoader classLoader1 = Class.forName("thread.Productor").getClassLoader();
        System.out.println(classLoader1);
        System.out.println(forName);
        System.out.println("加载");
    }
}

class Productor{
    private String name;
    private int age;

    public Productor() {
    }

    public Productor(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Productor{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值